2010-03-16 2 views
0

나는 CUDA로 놀고있다.CUDA에서 다중 스레드로 장치 변수 사용

현재 문제가 있습니다. 특정 응답에 대해 큰 배열을 테스트 중이며 응답을 받으면 다른 배열에 데이터를 복사해야합니다.
[V1] V2 :
가 [] [] [V1] [] [] [V2]

결과는 다음과 같이 표시한다 : 예를 들어

5 개, 소자 내 테스트 배열은 다음과 같다 ]

문제점은 결과를 저장할 두 번째 배열의 주소를 어떻게 계산합니까? 첫 번째 배열의 모든 요소는 병렬로 검사됩니다.

나는 장치 변수를 선언 할 생각하고는 는 요지 = 0 내가 응답을 찾을 때마다, 나는 요지을 증가합니다 int로. 하지만 그 이유는 확실하지 않습니다. addr에 동시에 액세스 할 수 있습니다. 그게 문제를 일으킬까요? 아니면 스레드가 다른 스레드가 해당 변수를 사용하여 끝날 때까지 기다릴 것인가?

답변

1

보이는 것처럼 사소하지 않습니다. 방금 방금 구현 했으므로 필요한 것을 말할 수 있습니다. 012.챕터를 읽으십시오. 39.3.1 스트림 압축.

SDK의 LargeArrayScan 예제에서 직접 시작하려면 사전 스캔을해야합니다. dev_prescan_arraydev_result_array 크기 N 모두 선택 될dev_elements_array 요소 dev_selection_array - 사용자가 장치 메모리의 선택 어레이가 가정 (폐기 1과 0의 의미 1- 배열하면 0을 선택) 산란은 OTH에 대한

__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]; 
} 
} 

입니다 당신은

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

을 어차피 좋은 응용 프로그램을 신문을 참조하십시오 Ble93

즐겁게 보내세요!

0

당신은 고전적인 스트림 압축에 대해 이야기하고 있습니다. 일반적으로 나는 Thrust 또는 CUDPP을 보길 권합니다 (링크는 압축 문서로 이동합니다). 이 두 가지 모두 오픈 소스이기 때문에 자신 만의 롤을 만들고 싶다면 '스캔'SDK 샘플을 살펴 보는 것이 좋습니다.

관련 문제