그룹화 어떻게 내가 배열의 일부 치수를 추가하고 다음 예에서 낮게 새로운 수의사에 저장 적용 할 수있는 어떤 기법을 알고 싶습니다 :합이 CUDA는
A -> [1,2] [3,4], [5,6]
B -> [3], [7], [11]
그림 : 당신이 당신의 자신의 CUDA를 작성하려면 http://snag.gy/83Qwl.jpg
그룹화 어떻게 내가 배열의 일부 치수를 추가하고 다음 예에서 낮게 새로운 수의사에 저장 적용 할 수있는 어떤 기법을 알고 싶습니다 :합이 CUDA는
A -> [1,2] [3,4], [5,6]
B -> [3], [7], [11]
그림 : 당신이 당신의 자신의 CUDA를 작성하려면 http://snag.gy/83Qwl.jpg
커널을 보려면 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 코드 (
의 중복 가능성 http://stackoverflow.com/questions/17862078/ :를 A 어레이의 행에 대응하는 "키"어레이 쿠다 - 코드 합 -of-rows-of-a-matrix-too-slow) – kangshiyin