1
我試圖利用我的Nvidia Geforce GT 740M進行並行編程,使用OpenMP和鏗鏘3.8編譯器。如何使用OpenMP在GPU上分發團隊?
當在CPU上並行處理時,我設法得到想要的結果。但是,在GPU上處理時,我的結果幾乎是隨機數。
因此,我認爲我沒有正確地分配我的線程團隊,並且可能會有一些數據競賽。我想我必須以不同方式執行我的for循環,但我不知道錯誤可能在哪裏。
#include <stdio.h>
#include <stdlib.h>
#include <omp.h>
int main(int argc, char* argv[])
{
const int n =100; float a = 3.0f; float b = 2.0f;
float *x = (float *) malloc(n * sizeof(float));
float *y = (float *) malloc(n * sizeof(float));
int i;
int j;
int k;
double start;
double end;
start = omp_get_wtime();
for (k=0; k<n; k++){
x[k] = 2.0f;
y[k] = 3.0f;
}
#pragma omp target data map(to:x[0:n]) map(tofrom:y[0:n]) map(to:i) map(to:j)
{
#pragma omp target teams
#pragma omp distribute
for(i = 0; i < n; i++) {
#pragma omp parallel for
for (j = 0; j < n; j++){
y[j] = a*x[j] + y[j];
}
}
}
end = omp_get_wtime();
printf("Work took %f seconds.\n", end - start);
free(x); free(y);
return 0;
}
我想這可能與我的GPU架構有關。所以,所以我加入這個:
林相當新的話題,所以感謝您的幫助:)
是的,這的確解決了我的問題,謝謝。 但如果我有一個數組'y [i] [j]'而不是'y [j]'我仍然有同樣的問題。 我的猜測是我必須改變迭代器。而不是「+ 1」,迭代GPU塊或類似的東西。但我真的不知道如何。 – Atrobbus
如果你有一個數組y [i] [j]它應該是免費的。你可以發佈你的修改程序嗎? –
你是對的另一個變量引起的數據競爭。現在一切正常。 – Atrobbus