2017-12-23 12 views
0

나는 다음과 같은 커널 패션을 나누기 동적 병렬 처리를 사용하고 정복 정수 배열의 최대 값을 가져옵니다 하나를 동적 병렬 테스트입니다 as : getMax<<<1,1>>>(d_arr, 0, N, d_max), d_arr 배열, N 해당 크기 및 d_max 최대 값. 때로는 올바른 출력을 얻을 수 있지만,이 내가 잘못된 사람에서 볼하는 경향이 속성이 있습니다동기화

10 6 8 7 14 4 0 4 9 8 6 4 8 10 5 1 
Max1: 0, Max2: 0 (ini:0,fin:4) 
Elem: 10 (ini:0) 
Max1: 10, Max2: 0 (ini:0,fin:2) 
Elem: 6 (ini:1) 
Elem: 8 (ini:2) 
Max1: 8, Max2: 0 (ini:2,fin:4) 
Elem: 7 (ini:3) 
Max1: 8, Max2: 8 (ini:4,fin:8) 
Elem: 14 (ini:4) 
Max1: 14, Max2: 6 (ini:4,fin:6) 
Elem: 4 (ini:5) 
Elem: 0 (ini:6) 
Max1: 0, Max2: 8 (ini:6,fin:8) 
Elem: 4 (ini:7) 
Max1: 0, Max2: 8 (ini:0,fin:8) 
Max1: 0, Max2: 4 (ini:8,fin:12) 
Elem: 9 (ini:8) 
Max1: 9, Max2: 4 (ini:8,fin:10) 
Elem: 8 (ini:9) 
Elem: 6 (ini:10) 
Max1: 6, Max2: 4 (ini:10,fin:12) 
Elem: 4 (ini:11) 
Max1: 6, Max2: 6 (ini:12,fin:16) 
Elem: 8 (ini:12) 
Max1: 8, Max2: 8 (ini:12,fin:14) 
Elem: 10 (ini:13) 
Elem: 5 (ini:14) 
Max1: 5, Max2: 6 (ini:14,fin:16) 
Elem: 1 (ini:15) 
Max1: 4, Max2: 6 (ini:8,fin:16) 
Max1: 8, Max2: 6 (ini:0,fin:16) 
Device max: 8 
Host max: 14 

당신이 볼 수 있듯이, 자녀가 실행을 완료하기 전에 아버지가 인쇄 메쉬있는 많은 시간이있다, cudaDeviceSynchronize()이 사용되고 있습니다. 더 나쁜 것은, 최종 결과물에서 일부 아이들의 가치가 고려되지 않아 GPU에서 잘못된 결과를 얻는 것입니다.

(전역 메모리를 사용하는) 커널 내부에서 malloc을 사용하고 있으며 동적 병렬 처리 자체가 현재이 코드가 CPU보다 빠른 속도를 낼 정도로 빠르다고 알고 있습니다. 이 코드가 제대로 동기화되지 않는 이유를 이해하고 싶습니다.

답변

2

언제든지 CUDA 코드에 문제가있는 경우 cuda-memcheck 코드를 실행하고 proper CUDA error checking 코드를 실행하는 것이 좋습니다. CUDA Dynamic Parallelism (CDP) 코드의 경우 장치 측 커널 시작과 런타임 API의 장치 사용에 대해 동일한 방식으로 오류 검사를 수행 할 수 있습니다. 생성 된 오류 출력을 이해하지 못하는 경우에도 도움이되는 사용자에게 유용합니다.

또한 작동하지 않는 코드에 대한 도움을 요청할 때는 을 제공하는 supposed입니다. 그러나이 경우 나는 내 자신의 호스트 테스트 코드를 추가하여 관찰을 재현 할 수있었습니다.

이 경우 문제는 here과 같이 CDP와 관련된 기본 중첩 및 동기화 심도를 초과하고있는 것으로 보입니다. 호스트 코드의 시작 부분에 추가 라인을 추가함으로써

는 :

cudaError_t err = cudaDeviceSetLimit(cudaLimitDevRuntimeSyncDepth, 16); 

나는 관찰 된 문제가 해결 내 테스트 케이스에 갈 수 있도록 할 수 있었다.

문서의 최대 한도는 24이므로 각 재귀 수준에서 장치 동기화가 필요한 재귀 메커니즘은 문제 크기가 커질수록 효과가 없습니다.

나는 당신이 학습 운동으로 이것을 추구하고 있다고 가정합니다. 실제 최대 검색에 관심이 있다면 far more efficient reduction based techniques입니다.

+0

놀라운 답변 사람! –