我使用以下命令在程序的可用线程上并行化单个循环:
#pragma omp parallel for num_threads(threads)
for(long i = 0; i < threads; i++)
{
array[i] = calculateStuff(i,...);
}
由于技术原因,我想保证第0号线程执行i=0
,第1号线程执行i=1
。换句话说,我总是想要i=omp_get_thread_num()
。这可能吗?
答案 0 :(得分:4)
尝试
#pragma omp parallel for num_threads(threads) schedule(static,1)
现在@Hristo Iliev已经出现了,我100%确信OpenMP标准要求静态计划将迭代0分配给线程0,1到1,等。
尝试一下,让我们知道你是怎么过的。
然后再次
#pragma omp parallel for num_threads(threads) schedule(dynamic,1)
也应该工作,因为你只有你拥有线程的迭代次数。但是,如果线程0在线程n
开始之前完成其工作,则线程0将获取迭代n
。
答案 1 :(得分:4)
在特定情况下使用循环是浪费资源。只需使用omp_get_thread_num()
:
#include <omp.h>
#pragma omp parallel num_threads(threads)
{
int i = omp_get_thread_num();
array[i] = calculateStuff(i,...);
}