OpenMP 指定 for 循环迭代的线程数
OpenMP specify thread number of a for loop iteration
我正在使用以下命令在程序的可用线程上并行化单个循环:
#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()
。这可能吗?
尝试
#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
.
在这种特殊情况下,使用循环是一种资源浪费。只需使用 omp_get_thread_num()
:
#include <omp.h>
#pragma omp parallel num_threads(threads)
{
int i = omp_get_thread_num();
array[i] = calculateStuff(i,...);
}
我正在使用以下命令在程序的可用线程上并行化单个循环:
#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()
。这可能吗?
尝试
#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
.
在这种特殊情况下,使用循环是一种资源浪费。只需使用 omp_get_thread_num()
:
#include <omp.h>
#pragma omp parallel num_threads(threads)
{
int i = omp_get_thread_num();
array[i] = calculateStuff(i,...);
}