我的需求是这样的:每个线程自己分配内存,然后处理:
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
......
}
有没有更好的方法?
最佳答案
我想你正在寻找这个:
#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 才能正常工作。
不过,您应该尽量避免这样做,因为取消的费用很高。
关于c++ - 如何处理 OpenMP 并行代码中的返回?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41886513/