OpenMP意外输出
OpenMP Unexpected output
我有两个并行的线程,但这一个不分解成线程:
#pragma omp parallel sections
{
#pragma omp section
{
for(int i=0;i<4;++i)
printf("Loop A %d %dn", omp_get_thread_num(),2);
}
#pragma omp section
{
for(int i=0;i<4;++i)
printf("Loop B %d %dn", omp_get_thread_num(),3);
}
}
输出:运行……
Loop A 0 2
Loop A 0 2
Loop A 0 2
Loop A 0 2
Loop B 0 3
Loop B 0 3
Loop B 0 3
Loop B 0 3
发生这种情况的原因有很多。我将列出我知道的可能的:
1:确保您实际上有一个多核机器。如果它是一个单核机器(没有HT),它将只运行一个线程。
2:如果这是在Visual Studio上,您需要启用OpenMP支持。仅仅包含标题是不够的:
Project -> Properties -> Configuration Properties -> C/C++ -> Language -> Open MP Support
将其更改为Yes (/openmp)
,应该是启用的。
我运行你的代码与OpenMP设置正确,我得到这个:
Loop A 0 2
Loop B 2 3
Loop B 2 3
Loop B 2 3
Loop B 2 3
Loop A 0 2
Loop A 0 2
Loop A 0 2
所以我认为你的代码是正确的
这可能发生得太快了。我已经尝试了大量的迭代,它工作如预期:
// gcc -std=c99 *.c -fopenmp && ./a.out
#include <stdio.h>
#include <omp.h>
enum { N = 10000, M = N/2 };
static void loop(char* s, int d) {
for(int i=0;i<N;++i)
if (i % M == 0)
printf("Loop %s %d %d %dn", s, i, omp_get_thread_num(),d);
}
int main() {
#pragma omp parallel sections
{
#pragma omp section
loop("A", 2);
#pragma omp section
loop("B", 3);
}
}
输出Loop A 0 7 2
Loop B 0 4 3
Loop A 5000 7 2
Loop B 5000 4 3
相关文章:
- 更改.cpp程序的输入文件中数据的位置会意外更改输出
- 字符串比较中的意外输出
- 每次在 c++ 中输出不同(意外行为)
- 来自 decltype 的意外输出类型
- 字符数组到十六进制字符串的转换 - 意外输出
- 使用 boost::regex 从目录中获取带有一些正则表达式的文件名称时出现意外输出
- 使用后序遍历递归的深度优先搜索会产生意外输出
- C++的意外输出
- 标准输出C++意外行为
- 贝金纳C++练习解决方案的意外输出
- 无效* 转换获得意外输出
- 以下程序的意外输出
- 意外输出:矢量矢量(功率集)
- 基本 int 数组提供意外输出
- 线程的意外输出
- 减法中的意外输出
- 带有左移操作员C 的意外输出
- C strncpy意外输出
- 意外输出..函数绑定在虚拟表中的发生方式
- 星号的意外输出