c - “omp parallel for”在“omp parallel”中不起作用
问题描述
我希望得到以下输出:
My rank is: 0 num is: 0
My rank is: 1 num is: 1
My rank is: 2 num is: 2
My rank is: 3 num is: 3
从以下代码:
#pragma omp parallel
{
int my_rank = omp_get_thread_num();
#pragma omp parallel for num_threads(4)
for(int i = 0; i < 4; i++){
printf("My rank is: %d num is: %d\n",my_rank, i);
}
}
但它给出了以下输出:
My rank is: 0 num is: 0
My rank is: 0 num is: 1
My rank is: 0 num is: 2
My rank is: 0 num is: 3
My rank is: 2 num is: 0
My rank is: 2 num is: 1
My rank is: 2 num is: 2
My rank is: 2 num is: 3
My rank is: 3 num is: 0
My rank is: 3 num is: 1
My rank is: 3 num is: 2
My rank is: 3 num is: 3
My rank is: 1 num is: 0
My rank is: 1 num is: 1
My rank is: 1 num is: 2
My rank is: 1 num is: 3
问题是什么?
解决方案
你不应该重复parallel
,你已经在一个parallel
块内,所以你只需要pragma omp for
循环,如果你指定,每个执行parallel
块的线程都会自动占用循环的一部分pragma omp for
。如果要指定可以执行的线程数,pragma omp parallel num_threads(4)
然后pragma omp for
. 在任何情况下,对于这么简单的一段代码,您都可以删除似乎不需要的整个外部块。
这是正确的版本:
#pragma omp parallel num_threads(4)
{
int my_rank = omp_get_thread_num();
#pragma omp for
for(int i = 0; i < 4; i++){
printf("My rank is: %d num is: %d\n", my_rank, i);
}
}
或者简单地说:
#pragma omp parallel for num_threads(4)
for(int i = 0; i < 4; i++){
printf("My rank is: %d num is: %d\n", omp_get_thread_num(), i);
}
推荐阅读
- javascript - 输入数字后如何自动将焦点移动到下一个字段?
- mysql - 如何使用 C# 和任务计划程序修复无法连接到任何指定的 MySQL 主机
- highcharts - Highchart - 散点图,点超出 y 轴
- php - 带有 sleep() + AJAX 的 PHP 脚本一个接一个地返回?
- docusignapi - 智威汤逊签名出庭
- javascript - 如果刷新页面,JS不会重新提交表单
- javascript - 浏览器扩展:防止脚本被执行
- javascript - 如何在这个数组中添加所有值?它每次都创建一个新的 CLIENT 数组并将值推送给它
- go - 通过client-go在端口转发中升级连接错误
- opengl - OpenGL 网格 + 镜像变换 = 错误的光照