2012-07-23 3 views
0
extern "C" void callKernel() 
{ 
    for(int i=0;i<10;i++) 
    { 
     calc<<< grid, thread >>>(d_arr); 
     copyElement<<< grid, thread >>>(d_arr,d_arr_part,3); 
     findMax<<< grid, thread >>>(d_arr_part, d_max); 
     positionChange<<< grid, thread >>>(d_arr, d_max); 
    } 
} 

위 코드는 컴퓨팅 커널에 관한 것입니다.CUDA에서 자체 커널 기능을 어떻게 동기화 할 수 있습니까?

커널 기능의 기능은 다음과 같습니다.

"calc": d_arr에서 계산하고 d_arr의 요소 값을 업데이트하십시오.

"copyElement": 예를 들어, d_arr이 4 단계 배열입니다. 배열에서 3 번째 요소 만 필요하므로 다른 변수 d_arr_part를 할당하고 d_arr_part의 3 번째 요소에 복사하십시오.

"findMax": d_arr_part에서 최대 값을 찾아 최대 값을 d_max에 저장합니다.

"positionChange": d_arr 요소가 d_max 값에 따라 업데이트됩니다.

문제

내 프로그램을 실행

, 결과는 일관성이 없습니다. 내가 실행할 때마다 결과가 변경됩니다. Google에서이 문제를 검색하고 커널 기능이 동시에 실행되는지 확인합니다. 나의 의도는 모든 커널 기능이 순차적으로 실행됩니다. 나는 3.2.5 절에서 NVIDIA의 CUDA C 프로그래밍 가이드를 읽었습니다. 그러나 나는 문제를 해결하기 위해 무엇을해야하는지 이해할 수 없다. 누구나 아이디어가 있다면, 저에게 그 길을 보여주십시오. 미리 감사드립니다.

+1

진단 내용이 잘못되었습니다. 이러한 커널은 모두 동일한 스트림으로 시작되기 때문에 동시에 실행되지 않습니다. 문제의 원인은 다른 것입니다. 아마도 커널의 오류 또는 전혀 실행되지 않은 오류 일 수 있습니다. 호스트 코드에 오류 검사를 추가하여 잘못된 점을 확인하십시오. – talonmies

+0

감사합니다. talonmies. 내 커널을 확인하겠습니다. –

답변

1

순차 순서를 보장하기 위해 커널 실행 사이에 cudaDeviceSynchronize을 사용할 수 있습니다. 그러나 코드에는이 코드가 필요하지 않으므로 커널에 버그가있을 수 있습니다.

+0

감사합니다, perreal. 커널 코드를 확인하겠습니다. –

관련 문제