当我使用ArrayFire时,我通常使用OpenCL后端。我在i7 CPU上使用Intel OpenCL。当我切换到AF_BACKEND_CPU后端时,我的代码慢了大约10-15倍。我查了一下,注意到它只在一个核心上运行。我还怀疑它没有使用SSE或AVX指令来解决其余的减速因为我的处理器只有4个内核。我觉得ArrayFire cpu后端应该更快。有没有办法让它成为多线程?
答案 0 :(得分:2)
CPU后端还没有多线程。但是从版本3.4.0开始,我怀疑它会发生变化(参见https://github.com/arrayfire/arrayfire/milestones上的“稀疏支持,线程安全,并行CPU”)
答案 1 :(得分:0)
我想知道同样的事情。事实证明,里程碑已经移至3.5.0(https://github.com/arrayfire/arrayfire/issues/451)。
据我所知,目前AF只使用了一个核心。所以4核仍然是3太多。
一般情况下,我建议将AF与GPU一起使用,并仅在需要时创建af :: array,因为否则无法仅在GPU上或仅在CPU上保存数据(请参阅How to explicitly get linear indices from arrayfire?和http://forums.accelereyes.com/forums/viewtopic.php?f=17&t=43097&p=61730&hilit=copy+host+memory+into+an+array#p61727关于如何构建af::array
ad-hoc。)
同样作为许多任务的一般经验法则,GPU实现仍然比CPU实现快得多,即使任务不适合CPU。参见例如通常涉及大量分支的排序算法。
如果你坚持并行使用CPU,你也可以尝试将OpenMP,MPI或stl :: thread放在AF之上并像这样并行化。我没有用stl :: thread获得很多用于排序操作。