1
我在OpenMP中創建了幾個任務,但由於某些原因,這些任務由同一個線程執行。該代碼具有以下模式:OpenMP任務 - 阻止特定線程執行任務的方式?
#pragma omp parallel num_threads(n_threads)
#pragma omp single
while(!found){
/.... operations with k, e, y, dist, u, step
#pragma omp task firstprivate(k, e, y, dist, u, step)
process(k, e, y, dist, u, step, h, out);
}
是否有強迫OpenMP運行時系統分配的任務的所有線程的任何方式,但它創建的任務嗎?
感謝
編輯:
void process(int a[]){
printf("Thread %d processing\n", omp_get_thread_num());
/* Heavy Operations (used sleep to simulate them)*/
sleep(10);
}
int main(){
int a[10];
int i, j;
#pragma omp parallel num_threads(4)
{
#pragma omp single
{
for (j = 0; j < 10; j++) {
/* Compute a */
for (i = 0; i < 10; i++) {
a[i] += 1;
}
#pragma omp task firstprivate(a)
process(a);
}
printf("Thread %d finished preprocessing\n", omp_get_thread_num());
}
}
}
輸出:
Thread 1 processing
Thread 1 processing
Thread 1 processing
Thread 1 processing
Thread 1 processing
Thread 1 processing
Thread 1 processing
Thread 1 processing
Thread 1 processing
Thread 1 processing
Thread 1 finished preprocessing
這不完全相同的問題。我添加了一個我正在使用的代碼的簡單版本,它是輸出。它應該編譯沒有問題。正如您所看到的,線程1正在執行每個任務,並且只有在計算完所有任務後才退出循環。 – fc67
我使用的是gcc 4.8.2。我正在用這種方式編譯gcc -fopenmp -O2 test.c -o test.o. – fc67