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

Nan*_*iao 2 c c++ parallel-processing multithreading 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;
        }
        ......          
    }
}
Run Code Online (Sandbox Code Playgroud)

但编译器会抱怨:

error: invalid exit from OpenMP structured block
     return;
Run Code Online (Sandbox Code Playgroud)

所以除了把分配内存代码放在#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
    ......
}
Run Code Online (Sandbox Code Playgroud)

有没有更好的方法?

Ric*_*ard 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
        }
        ......          
    }
}
Run Code Online (Sandbox Code Playgroud)

但是您需要将环境变量设置OMP_CANCELLATION为true才能使其正常工作.

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