我有以下代码:
[...]
#pragma omp parallel
{
#pragma omp single firstprivate(nodes)
{
[...] /* Do some calculation to find out the value of "nodes" */
double *tForTasks[nodes];
for(node=0; node < nodes ; node++){
#pragma omp task private(l, k ,j) shared(tForTasks)
{
[...] /* Piece of iterative kernel that writes on tForTasks and on private data structures */
}
}
}
[...]
我发现将tForTasks定义为shared会导致分段错误,但是从任务声明中去掉shared(tForTasks)就可以了。我做错什么了吗?
我没有提供更多的代码,因为它似乎与问题无关(如果需要什么,请告诉我)。对于1到16之间的任何数量的线程,我都有分段错误。没有共享(tForTasks),我就没有它。
谢谢
最佳答案
根据OpenMP规范(link?)。因此,它可以比task
数组存活并在其销毁后运行。因此,当您声明它tForTasks
时,任务可以引用未初始化或已解除分配的内存提升分段错误。当省略shared
规范时,数组将作为shared
复制到每个任务,因为它是在并行区域中声明的。但在这种情况下,一个线程将看不到其他线程对firstprivate
的写操作。
一种解决方案是动态分配数组,并在任务完成后释放它。