2017-05-18 14 views
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의 아키텍처에는 뭔가 다를 수 있습니다. 그래서 그러므로 나는이 추가 해요 : 당신의 도움 :)

답변

0

예, 여기 경주가에 대한

GPU Information

임 비교적 새로운 주제에, 너무 감사합니다. 다른 팀은 'y'배열의 동일한 요소를 읽고 쓰고 있습니다. 아마도 당신은 이런 것을 원할 것입니다.

for(i = 0; i < n; i++) { 
    #pragma omp target teams distribute parallel for 
    for (j = 0; j < n; j++){ 
    y[j] = a*x[j] + y[j]; 
    } 
} 
+0

예, 내 문제를 해결합니다. 그러나'y [j]'대신'y [i] [j]'배열이있는 경우에도 같은 문제가 발생합니다. 제 생각에는 iterator를 변경해야한다는 것입니다. '+ 1'대신 GPU 블록이나 그와 유사한 것을 반복합니다. 그러나 나는 어떻게하는지 정말로 모른다. – Atrobbus

+0

y [i] [j]라는 배열을 가지고 있다면 경주가 없어야합니다. 수정 된 프로그램을 게시 할 수 있습니까? –

+0

다른 변수로 인한 데이터 경쟁이 있습니다. 이제 모든 것이 잘 작동합니다. – Atrobbus