我在taskloop
构造中使用OpenMP task
构造:
double compute(int input) {
int array[4] = {0};
double value = input;
#pragma omp taskloop private(value)
for(int i=0; i<5000000; i++) {
// random computation, the result is not meaningful
value *= std::tgamma(std::exp(std::cos(std::sin(value)*std::cos(value))));
int tid = omp_get_thread_num();
array[tid] ++;
}
for(int i=0; i<4; i++) {
printf("array[%d] = %d ", i, array[i]);
}
printf("\n");
return value;
}
int main (int argc, char *argv[]) {
omp_set_nested(1);
omp_set_num_threads(4); // 4 cores on my machine
#pragma omp parallel
{
#pragma omp single
{
#pragma omp task
{ compute(omp_get_thread_num()); }
}
}
}
结果数组均为0。但是,如果我将
taskloop
更改为parallel for
: #pragma omp parallel for private(value)
for(int i=0; i<5000000; i++) {
value *= std::tgamma(std::exp(std::cos(std::sin(value)*std::cos(value))));
int tid = omp_get_thread_num();
array[tid] ++;
}
那么每个索引的数组结果是1250000。我使用
taskloop
构造有什么问题吗? 最佳答案
通过@Cimbali的确认,看来您的问题是该数组未在线程之间共享。由于您没有明确声明变量数组是共享的或私有(private)的,因此OpenMP将根据其规则来确定它。与并行相比,任务具有特殊的数据共享属性。我找不到明确指定规则的任何内容。 This是我能找到的最好的。尝试指定默认子句,并共享数组变量。
关于c++ - 任务内部的OpenMP Taskloop,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/59708332/