我的要求是这样的:每个线程自己分配内存,然后处理它:
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
......
}
有没有更好的方法?
答案 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)系统,它可能会有很大的不同。