나는 다음과 같은 커널 패션을 나누기 동적 병렬 처리를 사용하고 정복 정수 배열의 최대 값을 가져옵니다 하나를 동적 병렬 테스트입니다 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보다 빠른 속도를 낼 정도로 빠르다고 알고 있습니다. 이 코드가 제대로 동기화되지 않는 이유를 이해하고 싶습니다.
놀라운 답변 사람! –