2016-03-30 8 views
1

私は通常、ArrayFireを使用するときにOpenCLバックエンドを使用します。私はi7 CPUでIntel OpenCLを使用していました。私がAF_BACKEND_CPUバックエンドに切り替えたとき、私のコードは約10-15倍遅かったです。私はそれが1つのコアでのみ実行されていることを確認し、気づいた。また、私のプロセッサは4つのコアしかないので、残りの減速を説明するのはSSEまたはAVX命令を使用していないと思われます。私はArrayFireのCPUバックエンドがより速くなければならないように感じる。マルチスレッドにする方法はありますか?ArrayFire AF_BACKEND_CPUはマルチスレッドではありませんか?

答えて

2

CPUバックエンドはまだマルチスレッド化されていません。しかし、バージョン3.4.0から、私はそれが変更されると思われます(https://github.com/arrayfire/arrayfire/milestonesの「スパースサポート、スレッドセーフティ、パラレルCPU」を参照)

0

私は同じことを思っていました。マイルストーンは3.5.0(https://github.com/arrayfire/arrayfire/issues/451)に変更されています。

私が見ることができる限り、現在のところ、AFでは1つのコアのみが使用されています。だから4つのコアはまだ3です。

GPUだけで、あるいはCPU上でデータを保持する方法がないので、一般的に私はGPUと一緒にAFを使用し、af :: arrayを作成することをお勧めします(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アドホック)

また、多くのタスクの一般的なルールとして、GPUの実装はCPUの実装よりもはるかに高速です。通常、多くの分岐を伴うソートアルゴリズムを参照してください。

CPUを並列に使用することを主張する場合は、OpenMP、MPI、または単にstl :: threadをAFの上に置き、このように並列化することもできます。私は操作をソートするためにstl :: threadで多くは得られませんでした。

関連する問題