この再帰関数をopenmpで並列化しようとしています:
#include <stdio.h>
#include <omp.h>
void rec(int from, int to){
int len=to-from;
printf("%X %x %X %d\n", from, to, len, omp_get_thread_num());
if (len > 1){
int mid = (from+to)/2;
#pragma omp task
rec(from, mid);
#pragma omp task
rec(mid, to);
}
}
int main(int argc, char *argv[]){
long len=1024;
#pragma omp parallel
#pragma omp single
rec(0, len);
return 0;
}
しかし、それを実行すると、segfault が発生します。
$g++ -fopenmp -Wall -pedantic -lefence -g -O0 test.cpp && ./a.out
0 400 400 0
0 200 200 1
200 400 200 0
Segmentation fault
valgrind で実行すると、エラーは表示されません。-lefence がなくても機能します。
#pragma omp 句のすべての可能な組み合わせを試しましたが、1 スレッドまたはセグメンテーション違反のいずれかです。
なにが問題ですか?
どうもありがとう。