c - 我想使用 openmp 并行运行两个单独的循环
问题描述
两个不同的循环应该在 C 中使用 openmp 并行运行。我是 openmp 的新手,并且找到了单个循环的步骤并行运行而不是多个循环的解决方案。请有人建议如何去做。
#include<stdio.h>
int main()
{
// this loop must run on processor 1
for(int i=0;i<k;i++)
{ // work to be done in loop1
}
//this loop must run on processor 2
for(int i=0;i<k;i++)
{ //work to be done in loop2
}
}
解决方案
你可以这样做,但请阅读下面的警告。
int id;
#pragma omp parallel private(id) num_threads(2)
{
id = omp_get_thread_num();
if(id == 0) {
// Loop1
}
else if(id == 1) {
// Loop2
}
}
很不言自明。创建两个线程,获取正在执行的线程的 id 并根据 id 选择要执行的操作。
然而,这是一种非常尴尬的做法。这不是您通常使用 OpenMP 并行处理内容的方式。这更多还是 Pthreads 风格。
警告
请记住,这num_threads(2)
并不能保证您有两个线程。所以如果你想使用这种方法,你需要某种保护。
if(omp_get_num_threads() < 2) {
// Serial code
} else {
// Parallel code
}
突然之间,一切都变得非常笨拙。
推荐阅读
- jenkins - JobsDSL 和 Jenkins 版本
- javascript - 使用 Jquery animate 让一个按钮将一个框移动到下一个角落
- apache - IfDefine 和 RewriteBase 不能很好地协同工作
- vba - 将标题添加到带有多行的消息框
- java - 在 Android 的正在进行的通知更新中禁用声音
- python - 使用两个变量优化 cumprod()
- three.js - 为什么我的系统上的 three.js 示例中的 GPU 选择如此缓慢?
- android - Gradle 错误:找不到 com.android.tools.build:gradle:2.2.+ 的任何匹配项
- powershell - 使用 Get-MailboxFolderPermission 循环遍历所有日历
- kubernetes - 为什么 kubernetes v13 的 API 会随机掉线?