在OPENMP中使用for循环输出错误

时间:2013-09-20 16:28:07

标签: for-loop openmp

嗨,我是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 

没有打开mp一切都很好但是并行性 输出变得错误。有什么错误的OpenMp?还是我的代码?

1 个答案:

答案 0 :(得分:1)

由于你在for构造中使用了“ordered”子句,你是否试图以有序的方式运行部分并行“for”循环?

如果你在“for”构造中使用“ordered”来序列化循环部分(访问文件?),你还需要在循环体内部有一个“有序”构造来告诉编译器哪个部分并行循环必须按顺序执行:

#pragma omp parallel for ordered
for(...) {
  // something that runs parallel
  do_parallel();
  // serialize
#pragma omp ordered
  {
     do_ordered();
  }
}