嗨,我是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?还是我的代码?
答案 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();
}
}