如何在OpenMP并行代码中处理返回?

时间:2017-01-27 03:17:47

标签: c++ c multithreading parallel-processing openmp

我的要求是这样的:每个线程自己分配内存,然后处理它:

typedef struct
{
    ......
}A;

A *p[N];

#pragma omp parallel
{
    #pragma omp for
    for (int i = 0; i < N; i++) {
        p[i] = (A*)calloc(sizeof(*p[i]), N);
        if (NULL == p[i]) {
            return;
        }
        ......          
    }
}

但编译器会抱怨:

error: invalid exit from OpenMP structured block
     return;

所以除了将分配内存代码放在#pragma omp parallel之外:

for (int i = 0; i < N; i++) {
    p[i] = (A*)calloc(sizeof(*p[i]), N);
    if (NULL == p[i]) {
        return;
    }       
}
#pragma omp parallel
{
    #pragma omp for
    ......
}

有没有更好的方法?

2 个答案:

答案 0 :(得分:5)

你在寻找这个,我想:

#pragma omp parallel
{
    #pragma omp for
    for (int i = 0; i < N; i++) {
        p[i] = (A*)calloc(sizeof(*p[i]), N);
        if (NULL == p[i]) {
            #pragma omp cancel for
        }
        ......          
    }
}

但是您需要将环境变量OMP_CANCELLATION设置为true才能生效。

但是,你应该尽量避免这样做,因为取消费用很高。

答案 1 :(得分:3)

你可以试试这个

omp_set_dynamic(0); //Explicitly turn off dynamic threads
bool cancel = false;    

#pragma omp parallel for schedule(static)
for (int i = 0; i < N; i++) {
    p[i] = (A*)calloc(sizeof(*p[i]),N);
    if (NULL == p[i]) cancel = true;
}
if(cancel) return;
#pragma omp parallel for schedule(static)
for (int i = 0; i < N; i++) {
    ......   
}

这可以为每个核心/节点分配本地内存。我关闭动态调整线程数并使用schedule(static)来确保第二个for循环中的线程访问第一个for循环中分配的相同内存。

我不知道这个解决方案是否会更好。根据{{​​3}},情况会更糟。如果你有一个多插座(NUMA)系统,它可能会有很大的不同。