ArrayFire AF_BACKEND_CPU 不是多线程的?
ArrayFire AF_BACKEND_CPU not multi-threaded?
我通常在使用 ArrayFire 时使用 OpenCL 后端。我在我的 i7 CPU 上使用英特尔 OpenCL。当我切换到 AF_BACKEND_CPU 后端时,我的代码速度大约慢了 10-15 倍。我检查了一下,发现一个核心上只有 运行。我还怀疑它没有使用 SSE 或 AVX 指令来解释其余的减速,因为我的处理器只有 4 个内核。我觉得 ArrayFire cpu 后端应该更快。有没有办法让它多线程?
CPU 后端还不是多线程的。但是从 3.4.0 版本开始,我怀疑它会改变(参见 https://github.com/arrayfire/arrayfire/milestones 上的 "Sparse Support, Thread Safety, Parallel CPU")
我也在想同样的事情。事实证明,里程碑已移至 3.5.0 (https://github.com/arrayfire/arrayfire/issues/451)。
据我所知,AF 目前只使用了一个内核。所以4核还是3核太多了。
一般来说,我建议将 AF 与 GPU 一起使用,并仅在需要时创建 af::array,因为没有其他方法可以仅在 GPU 或 [=26] 上保存数据=](参见 How to explicitly get linear indices from arrayfire? and http://forums.accelereyes.com/forums/viewtopic.php?f=17&t=43097&p=61730&hilit=copy+host+memory+into+an+array#p61727 如何构建 af::array
s ad-hoc。)
此外,作为许多任务的一般经验法则,GPU 实现仍然比 CPU 实现快得多,即使该任务并不完全适合 CPU。请参阅通常涉及大量分支的排序算法示例。
如果您坚持使用 CPU 并行,您也可以尝试将 OpenMP、MPI 或只是 stl::thread 放在 AF 之上并像这样并行化。不过,我在 stl::thread 的排序操作中并没有得到很多。
我通常在使用 ArrayFire 时使用 OpenCL 后端。我在我的 i7 CPU 上使用英特尔 OpenCL。当我切换到 AF_BACKEND_CPU 后端时,我的代码速度大约慢了 10-15 倍。我检查了一下,发现一个核心上只有 运行。我还怀疑它没有使用 SSE 或 AVX 指令来解释其余的减速,因为我的处理器只有 4 个内核。我觉得 ArrayFire cpu 后端应该更快。有没有办法让它多线程?
CPU 后端还不是多线程的。但是从 3.4.0 版本开始,我怀疑它会改变(参见 https://github.com/arrayfire/arrayfire/milestones 上的 "Sparse Support, Thread Safety, Parallel CPU")
我也在想同样的事情。事实证明,里程碑已移至 3.5.0 (https://github.com/arrayfire/arrayfire/issues/451)。
据我所知,AF 目前只使用了一个内核。所以4核还是3核太多了。
一般来说,我建议将 AF 与 GPU 一起使用,并仅在需要时创建 af::array,因为没有其他方法可以仅在 GPU 或 [=26] 上保存数据=](参见 How to explicitly get linear indices from arrayfire? and http://forums.accelereyes.com/forums/viewtopic.php?f=17&t=43097&p=61730&hilit=copy+host+memory+into+an+array#p61727 如何构建 af::array
s ad-hoc。)
此外,作为许多任务的一般经验法则,GPU 实现仍然比 CPU 实现快得多,即使该任务并不完全适合 CPU。请参阅通常涉及大量分支的排序算法示例。
如果您坚持使用 CPU 并行,您也可以尝试将 OpenMP、MPI 或只是 stl::thread 放在 AF 之上并像这样并行化。不过,我在 stl::thread 的排序操作中并没有得到很多。