0

こんにちは OpenMp の初心者で、単純な for ループに問題があります。これは私のコードです:

   #include "stdafx.h"
   #include <Windows.h>
   #include <omp.h>

   char str[20];
   INT64 i;

   int main()
   {
   HANDLE hAppend;
   DWORD dwBytesToWrite ,dwPos;
   DWORD dwBytesWritten = 0;
   hAppend = CreateFile(L"log.txt" , 
   GENERIC_WRITE, 
   0, // do not share
   NULL, 
   OPEN_ALWAYS, 
   FILE_ATTRIBUTE_NORMAL,
   NULL); 

   #pragma omp parallel num_threads(4) private(i)
   {
    #pragma omp for ordered 
    for( i=0; i<=MAXINT64;i++)
    {     

sprintf(str,"%x | %x \r\n",i);
    dwPos = SetFilePointer(hAppend, 0, NULL, FILE_END);

    LockFile(hAppend, dwPos, 0, strlen(str), 0);
    WriteFile(
          hAppend,
          str,
          strlen(str),
          &dwBytesWritten,
          NULL 

             );
      }
     }
    }

これは出力の一部です。

1ee5 | 60000000 
1ee6 | 60000000 
1ee7 | 60000000 
1ee8 | 60000000 
1ee9 | 60000000 
1eea | 60000000 
0 |  | 60000000 
0 | 40000000 
1eed | 600000001 | 40000000 
2 | 40000000 
1 | 40000000 
1eee | 60000000 
1eef | 60000000 
1ef0 | 60000000 
1ef1 | 60000000 
3 | 40000000 
1ef 40000000 
4 | 40000000 
2 | 0 
3 | 0 
4 | 0 

open mp がなければすべて問題ありませんが、並列処理の出力が間違っています。

4

1 に答える 1

1

for コンストラクトで「ordered」句を使用しているため、並列「for」ループの一部を順序付けて実行しようとしていますか?

「for」構造で「ordered」を使用してループの一部をシリアル化する場合 (ファイルへのアクセス?)、並列ループのどの部分をシリアル化する必要があるかをコンパイラに伝えるために、ループ本体内に「順序付けられた」構造も必要です。次の順序で実行されます。

#pragma omp parallel for ordered
for(...) {
  // something that runs parallel
  do_parallel();
  // serialize
#pragma omp ordered
  {
     do_ordered();
  }
}
于 2013-09-21T02:04:40.897 に答える