当我使用ArrayFire时,我通常使用OpenCL后端。我在i7 CPU上使用英特尔OpenCL。当我切换到AF_BACKEND_CPU后端时,我的代码大约慢了10-15倍。我检查了一下,发现它只在一个核心上运行。我还怀疑它没有使用SSE或AVX指令,因为我的处理器只有4个内核,所以导致了其余的速度减慢。我觉得ArrayFire的cpu后端应该更快。有没有办法使它成为多线程的?
CPU后端尚未实现多线程。但从3.4.0版本开始,我怀疑它会发生变化(请参阅上的"稀疏支持、线程安全、并行CPU"https://github.com/arrayfire/arrayfire/milestones)
我也在想同样的事情。事实证明,在此期间,里程碑已移至3.5.0(https://github.com/arrayfire/arrayfire/issues/451)。
据我所知,到目前为止,AF只使用了一个核心。所以4个核心还是3个太多了。
一般来说,我建议将AF与GPU一起使用,并仅在需要时创建AF::数组,因为没有其他方法可以将数据仅保存在GPU或CPU上(请参阅如何从arrayfire显式获取线性索引?)http://forums.accelereyes.com/forums/viewtopic.php?f=17&t=43097&p=61730&hilit=复制+主机+内存+到+an+数组#p61727关于如何构建af::array
的自组织。)
同样,作为许多任务的一般经验法则,即使任务不完全适合CPU,GPU实现仍然比CPU实现快得多。例如,请参阅通常涉及大量分支的排序算法。
如果你坚持并行使用CPU,你也可以尝试将OpenMP、MPI或stl::thread放在AF之上,并像这样并行化。不过,使用stl::线程进行排序操作并没有给我带来太多好处。