Intel TBB を使用して内側のループ (3 番目の 2 番目) を並列化しようとしていますが、内側の 2 つのループのサイズが大きい場合にのみ適切な成果が得られます。
TBB はメジャー ループの反復ごとに新しいスレッドを生成していますか? とにかくオーバーヘッドを減らす方法はありますか?
tbb::task_scheduler_init tbb_init(4); //I have 4 cores
tbb::blocked_range<size_t> blk_rng(0, crs_.y_sz, crs_.y_sz/4);
boost::chrono::system_clock::time_point start =boost::chrono::system_clock::now();
for(unsigned i=0; i!=5000; ++i)
{
tbb::parallel_for(blk_rng,
[&](const tbb::blocked_range<size_t>& br)->void
{
:::
openMP (これを削除しようとしています!!!) にはこの問題がないことに注意してください。
私はコンパイルしています:
-03 -xHost -mavx のインテル ICC 12.1
Intel 2500k (4 コア)
編集: ループの結果に基づいて out ループ テストを述語に置き換える必要があるため、ループの順序を実際に変更できます。