我编写了一个算法,使用Intel内部函数并行执行多个单精度操作.我的算法的每次迭代的结果是单个256位向量(__m256
)中的非零项的数量.
例如:
00000000 FFFFFFFF 00000000 00000000 00000000 FFFFFFFF FFFFFFFF FFFFFFFF
Run Code Online (Sandbox Code Playgroud)
其中迭代的结果是4.
计算向量中非零项数的最快方法是什么?
目前我正在做这样的事情:
float results[8];
_mm256_storeu_ps(results, result_vector);
int count = 0;
for (uint32_t idx = 0; idx < 8; ++idx)
{
if (results[idx] != 0)
{
++count;
}
}
Run Code Online (Sandbox Code Playgroud)
这种方法运行得很好,但我想知道是否有更有效的方法来做,也许是一个不涉及商店的方法.
我正在研究一个涉及一些自定义硬件和我为硬件编写的自定义Linux设备驱动程序的系统.系统偶尔需要非常快速地移动大量数据,因此我的驱动程序动态地(即在需要时)分配大的(1 GB)DMA缓冲区,这些缓冲区被使用,然后在不再需要时释放.为了分配这么大的缓冲区,我实际上分配了一堆较小的缓冲区(256 X 4MB)dma_alloc_coherent
,然后使用它们将它们连续映射到用户空间remap_pfn_range
.这在大多数情况下非常有效.
在测试期间,在系统长时间运行测试用例之后,我有时会看到DMA分配失败,其中dma_alloc_coherent
我的驱动程序中的一个调用失败,导致我的应用层软件崩溃.我终于能够找到这个问题,我发现当我看到DMA分配失败时,Linux内核页面缓存非常充分.
例如,在我捕获页面缓存的最后一次失败中,在我的系统上填充了27 GB的32 GB RAM.我怀疑页面缓存"丰满"导致dma_alloc_coherent
调用失败.为了测试这个理论,我使用以下方法手动清空页面缓存:
# echo 1 > /proc/sys/vm/drop_caches
Run Code Online (Sandbox Code Playgroud)
这将缓存的大小从27 GB减少到94 MB,并且我能够分配20 + 1 GB DMA缓冲区而没有任何问题.
很明显,页面缓存是一件有益的事情,所以在分配DMA缓冲区时,每次空间不足时,我都不希望完全清空它.我的问题是:如何动态缩小内核空间中的页面缓存,这样如果调用dma_alloc_coherent
失败,我可以恢复足够的空间,以便我可以重试调用并使其成功?
我的系统是基于x86_64的,运行3.16.x Linux内核.
我发现了一些模糊的引用,表明我正在尝试的可能是什么,例如"当系统上其他地方需要内存时,内核会自动回收这些对象." (来自:https://www.kernel.org/doc/Documentation/sysctl/vm.txt).但是我还没有找到任何表明内存如何回收的细节.
对此的任何帮助将不胜感激!
首先,虽然我对SQL非常熟悉,但我是一个完整的Oracle noob.我有一个单一成本专栏.我需要计算总成本,总成本的百分比,然后计算百分比的运行总和.我遇到了百分比的运行总和,因为我能想到的唯一方法是使用嵌套的SUM函数,这是不允许的.
这是有效的:
SELECT cost, SUM(cost) OVER() AS total, cost / SUM(cost) OVER() AS per
FROM my_table
ORDER BY cost DESC
Run Code Online (Sandbox Code Playgroud)
这是我正在尝试做的不起作用:
SELECT cost, SUM(cost) OVER() AS total, cost / SUM(cost) OVER() AS per,
SUM(cost/SUM(cost) OVER()) OVER(cost) AS per_sum
FROM my_table
ORDER BY cost DESC
Run Code Online (Sandbox Code Playgroud)
我只是错了,或者我想做的事情是不可能的?顺便说一句,我使用的是Oracle 10g.在此先感谢您的帮助.
我正在尝试编写一个简单的程序来从一堆 AVRO 文件中提取一些数据。每个文件的架构可能不同,所以我想使用 C++ 接口一般地读取文件(即不必预先生成然后在每个架构中编译)。
我一直在尝试遵循该generic.cc
示例,但它假设有一个单独的架构,我想从每个 AVRO 文件中读取架构。
这是我的代码:
#include <fstream>
#include <iostream>
#include "Compiler.hh"
#include "DataFile.hh"
#include "Decoder.hh"
#include "Generic.hh"
#include "Stream.hh"
const std::string BOLD("\033[1m");
const std::string ENDC("\033[0m");
const std::string RED("\033[31m");
const std::string YELLOW("\033[33m");
int main(int argc, char**argv)
{
std::cout << "AVRO Test\n" << std::endl;
if (argc < 2)
{
std::cerr << BOLD << RED << "ERROR: " << ENDC << "please provide an "
<< "input file\n" << std::endl;
return -1;
}
avro::DataFileReaderBase dataFile(argv[1]);
auto dataSchema …
Run Code Online (Sandbox Code Playgroud)