1
OpenMP 및 clang-3.8 컴파일러를 사용하여 병렬 프로그래밍을 위해 Nvidia Geforce GT 740M을 활용하려고합니다.OpenMP를 사용하여 GPU에 팀을 배포하는 방법은 무엇입니까?
CPU에서 병렬 처리 할 때 원하는 결과를 얻을 수 있습니다. 그러나 GPU에서 처리 할 때 결과는 거의 임의의 숫자입니다.
따라서 스레드 팀을 올바르게 배포하지 못하고 일부 데이터 경쟁이있을 수 있다고 생각했습니다. 나는 for-loops를 다르게해야만한다고 생각하지만 실수가 어디에 있을지 전혀 모른다.
#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 [j]'대신'y [i] [j]'배열이있는 경우에도 같은 문제가 발생합니다. 제 생각에는 iterator를 변경해야한다는 것입니다. '+ 1'대신 GPU 블록이나 그와 유사한 것을 반복합니다. 그러나 나는 어떻게하는지 정말로 모른다. – Atrobbus
y [i] [j]라는 배열을 가지고 있다면 경주가 없어야합니다. 수정 된 프로그램을 게시 할 수 있습니까? –
다른 변수로 인한 데이터 경쟁이 있습니다. 이제 모든 것이 잘 작동합니다. – Atrobbus