2013-08-23 4 views
0

그룹화 어떻게 내가 배열의 일부 치수를 추가하고 다음 예에서 낮게 새로운 수의사에 저장 적용 할 수있는 어떤 기법을 알고 싶습니다 :합이 CUDA는

A -> [1,2] [3,4], [5,6]

B -> [3], [7], [11]

그림 : 당신이 당신의 자신의 CUDA를 작성하려면 http://snag.gy/83Qwl.jpg

+0

의 중복 가능성 http://stackoverflow.com/questions/17862078/ :를 A 어레이의 행에 대응하는 "키"어레이 쿠다 - 코드 합 -of-rows-of-a-matrix-too-slow) – kangshiyin

답변

1

커널을 보려면 Vector add sample을 살펴보십시오. 대신에 커널이 입력 벡터를 전달하는, 당신은 단지 A을 통과 할과 A의 "행"을 통해 합계를 루프를 제공

__global__ void mykernel(int *A, int *B, int rows, int cols){ 
    int idx=threadIdx.x+blockDim.x*blockIdx.x; 
    if (idx < rows) { 
    int sum = 0; 
    for (int i=0; i< cols; i++) 
     sum += A[(idx*cols)+i]; 
    B[idx] = sum; 
    } 
} 

이 정말 효율적으로되지 않습니다,하지만 당신은 효율성을 향상시킬 수 당신이 열 주요 순서대로 A 배열을 저장할 수있는 경우 :

A -> [1,3,5], [2,4,6] 

는 위의 커널에 대한 수정은 매우 효율적이된다 :

__global__ void mykernel(int *A, int *B, int rows, int cols){ 
    int idx=threadIdx.x+blockDim.x*blockIdx.x; 
    if (idx < rows) { 
    int sum = 0; 
    for (int i=0; i< cols; i++) 
     sum += A[(i*cols)+idx]; 
    B[idx] = sum; 
    } 
} 

효율성을 찾고 있지만 데이터를 재구성 할 수없는 경우 세그먼트 병렬 감소가 가장 빠릅니다. 당신은 cuda sample codes를 기반으로 뭔가를 만드는 시도 할 수 있지만 그대로 당신은 당신의 A 배열을 떠날 특히 reduce_by_key

, thrust 사용하는 것이 좋습니다하고 "값"으로 사용합니다 :

A -> [1,2], [3,4], [5,6] 

그리고 당신은 만들 것이다

K -> [0,0], [1,1], [2,2] 
[너무 느린 행렬의 행의 합계 CUDA 코드 (