2017-09-26 9 views
0

私は、内部でOMPループを利用するmyFunc()関数を持っていますが、使用可能なすべてのコアを消費しません。より高いレベルでは、この関数をループ内で何度も呼びます。この外部ループでOMPを使用する簡単な方法はありますが、各ループパスを単一のスレッドに限定することはできませんか?C++各ループのOpenMP複数のスレッド

例えば:

// I have 24 cores 
// Would like to allow each for loop pass to have 12 cores 
for (int outIter=0; outIter<2; outIter++) { 
    x[outIter] = myFunc(...) // This function has OMP inside 
} 

答えて

1

myFuncはすべて24個のコアを排出することはできませんなぜあなたは最初、見つける必要があります。多くの場合、メモリ帯域幅によって制限されます。それを言って、上記のループは明らかに平行ではありません。 myFuncというの入力はomp_get_thread_num()の機能だろう

#pragma omp parallel num_threads(2) 
{ 
    myFunc(...); 
} 

:あなたはこのような何かをしようとしなければならないでしょう。しかし、やはり、より多くの並列性を達成できることを期待してはなりません。あなたの問題がメモリ帯域幅によって制限されていれば、スピードアップの希望はほとんどありません。おおよそあなたの中で何が起こるのですかmyFunc

+0

ありがとうございます、ええ、私はそれが並行ではないことを知っています。プラグマ文をforループのすぐ上に置くと、これは各ループ反復に1つのスレッドしか提供しないということです(通常の使用例はloop_iterations >> number_of_cores)。使用可能なスレッドが1つしかないため、ループ内の追加のOMP呼び出しは無効になります。関数の内部では、forループは繰り返し回数が少ないため、これをやろうとしています。 – user2364295

+0

内部であなたのompコールを使用しないでください。これは外側のループを2つに分解します。内部動作を2つのコアに限定するものではありません。 KMP_AFFINITYを指定して何かを取得した場合は、さらに見る必要があります。 –

関連する問題