我想知道我可以应用什么技术来增加数组的一些维数并保存到新的Vet know,如下面的示例所示:
A -> 1,2,3,4,5,6
B -> 3、7、11
图:http://snag.gy/83Qwl.jpg
发布于 2013-08-24 08:21:24
如果您想编写自己的CUDA内核,请看一下Vector add sample。不是将2个输入向量传递给内核,而是只传递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创建一些内容,但我建议您使用thrust,特别是reduce_by_key
您将保留A数组不变,并将其用作“值”:
A -> [1,2], [3,4], [5,6] 您将创建一个"key“数组,该数组对应于A数组的行:
K -> [0,0], [1,1], [2,2]https://stackoverflow.com/questions/18413481
复制相似问题