2009-03-23 12 views
0

誰でも考えてください。 OpenMPは、ダンベルを処理するためにCPUの筋肉を調整する機能を備えています。私のopenmpの研究では、強力な筋肉でブロックコードを実行するスレッドの優先順位を設定することはできません。優先順位が最も高いスレッドを作成するには、一方向(_beginthreadexまたは5のパラメータを持つCreateThread関数)のみを使用します。OpenMPの機能がありません:スレッドの優先度

ここでは、この問題のいくつかのコード:

これは手動設定です。ここで

int numberOfCore = (execute __cpuid to obtain number of cores on your cpu). 

HANDLES* hThreads = new HANDLES[ numberOfCore ]; 
hThreads[0] = _beginthreadex(NULL, 0, someThreadFunc, NULL, 0, NULL); 

SetThreadPriority(hThreads[0], HIGH_PRIORITY_CLASS); 

WaitForMultipleObjects(...); 

は、私はこの部分を見たいです。

#pragma omp parallel 
{ 
#pragma omp for (threadpriority:HIGH_PRIORITY_CLASS) 
for(;;) { ... } 
} 

それとも

#pragma omp parallel 
{ 
// Generally this function greatly appreciativable. 
_omp_set_priority(HIGH_PRIORITY_CLASS); 
#pragma omp for 
for(;;) { ... } 
} 

私は、OpenMPとセットアップの優先順位への道があったかどうかを知るplsは私達に知らせるいけません。

+0

スタックオーバーフローは、新規ユーザーにとって不愉快です。誰かを投票させるときは、なぜそれをしたのかを説明するコメントと、それを改善するために何をすべきかについてのヒントを残してください。 –

答えて

3

あなたは、OpenMPからの特別な支援を必要とせずにループの本体にSetThreadPriority操作を行うことができます。

for (...) 
{ 
    DWORD priority=GetThreadPriority(...); 
    SetThreadPriority(...); 
    // stuff 
    SetThreadPriority(priority); 
} 
0

簡単なテストでは、予想外の結果を明らかに: 私は、Visual Studio 2010(Windows 7の)で簡単なテストを実行しました:

#include <stdio.h> 
    #include <omp.h> 
    #include <windows.h> 

    int main() 
    { 
     int tid, nthreads; 

     SetThreadPriority(GetCurrentThread(), THREAD_PRIORITY_ABOVE_NORMAL); 

     #pragma omp parallel private(tid) num_threads(4) 
     { 
      tid = omp_get_thread_num(); 
      printf("Thread %d: Priority = %d\n", tid, GetThreadPriority(GetCurrentThread())); 
     } 

     printf("\n"); 

     #pragma omp parallel private(tid) shared(nthreads) num_threads(4) 
     { 
      tid = omp_get_thread_num(); 

      #pragma omp master 
      { 
       printf("Master Thread %d: Priority = %d\n", tid, GetThreadPriority(GetCurrentThread())); 
      } 
     } 

     #pragma omp parallel num_threads(4) 
     { 
      SetThreadPriority(GetCurrentThread(), THREAD_PRIORITY_ABOVE_NORMAL); 
     } 

     printf("\n"); 

     #pragma omp parallel private(tid) num_threads(4) 
     { 
      tid = omp_get_thread_num(); 
      printf("Thread %d: Priority = %d\n", tid, GetThreadPriority(GetCurrentThread())); 
     } 

     return 0; 
    } 

出力である:

Thread 1: Priority = 0 
    Thread 0: Priority = 1 
    Thread 2: Priority = 0 
    Thread 3: Priority = 0 

    Master Thread 0: Priority = 1 

    Thread 0: Priority = 1 
    Thread 1: Priority = 1 
    Thread 3: Priority = 1 
    Thread 2: Priority = 1 

説明: OpenMPマスター・スレッドは、メインのスレッド優先順位で実行されます。 他のOpenMPスレッドは通常優先度のままです。 OpenMPスレッドのスレッド優先度を手動で設定すると、スレッドはその優先度を維持します。

関連する問題