문제

나는 Cuda와 함께 놀고 있습니다.

현재 나는 문제가있다. 특정 응답을 위해 큰 배열을 테스트하고 있으며 응답을 얻을 때 데이터를 다른 배열에 복사해야합니다.

예를 들어 5 가지 요소 테스트 배열이 다음과 같습니다.
] [] [v1] [] [] [v2

결과는 다음과 같아야합니다.
v1] [v2

문제는 결과를 저장하기 위해 두 번째 배열의 주소를 계산하는 방법입니다. 첫 번째 배열의 모든 요소는 병렬로 점검됩니다.

장치 변수 int를 선언 할 생각입니다 addr = 0. 응답을 찾을 때마다 addr. 그러나 나는 그것이 그것을 의미하기 때문에 확실하지 않습니다. addr 동시에 여러 스레드로 액세스 할 수 있습니다. 그것이 문제를 일으킬까요? 아니면 스레드가 다른 스레드가 해당 변수를 사용하여 완료 될 때까지 대기합니까?

도움이 되었습니까?

해결책

보이는 것만 큼 사소하지 않습니다. 방금 하나를 구현하기 위해 끝났고 당신이 무엇을 읽어야하는지 알 수 있습니다. GPU 보석 3 기사를 스캔하십시오 특히 장 39.3.1 스트림 압축.

SDK의 Largearrayscan 예제에서 자신의 시작을 구현하려면 프리 스캔 만 제공합니다. 장치 메모리에 선택 배열이 있다고 가정하면 (1 및 0이라는 배열 1- 선택 0- 버림), dev_selection_arraydev_elements_array 선택할 요소 a dev_prescan_array 그리고 a dev_result_array 모든 크기 N 그럼 당신은합니다

prescan(dev_prescan_array,dev_selection_array, N);
scatter(dev_result_array, dev_prescan_array,
         dev_selection_array, dev_elements_array, N);

산란이있는 곳

 __global__ void scatter_kernel( T*dev_result_array, 
                   const T* dev_prescan_array, 
                   const T* dev_selection_array,
                   const T* dev_elements_array, std::size_t size){

unsigned int idx = blockIdx.x * blockDim.x + threadIdx.x;
if (idx >= size) return;
if (dev_selection_array[idx] == 1){
    dev_result_array[dev_prescan_array[idx]] = dev_elements_array[idx];
}
}

프리 스캔의 다른 좋은 적용은 종이를 참조하십시오. ble93

재미있게 보내세요!

다른 팁

당신은 고전적인 스트림 압축에 대해 이야기하고 있습니다. 일반적으로 나는 보는 것이 좋습니다 추력 또는 CUDPP (이러한 링크는 압축 문서로 이동합니다). 이 두 가지 모두 오픈 소스입니다. 만약 당신이 직접 굴려면 '스캔'SDK 샘플을 보는 것이 좋습니다.

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top