将Typename1的Cuda Array1转换为Typename2的Array2

时间:2010-12-06 12:05:58

标签: memory-management cuda

亲爱的Cuda学者,
 寻找以下问题的解决方案

a)我有两个数组  1)size1的array1,类型名为1  2)size1的array2,typename2

b)我想编写以下原型的内核

__global__ kernel(void* dest, void* src, int dest_sizeoftype, int src_sizeoftype, int num_array_elts);

c)假设我创建了num_array_elts cuda线程,每个线程将其elt复制到src到目的地。

问题: a)我遇到的地方是使用哪个函数将num_bytes从src复制到内核中的dest。

提前感谢你 问候, Nagaraju

2 个答案:

答案 0 :(得分:2)

Thrust中的copy算法简化了这一过程。

#include <thrust/copy.h>
#include <thrust/device_ptr.h>

int   * src = ...
float * dst = ...

// first wrap the 'raw' pointers
thrust::device_ptr<int>   wrapped_src(src);
thrust::device_ptr<float> wrapped_dst(dst);

// then pass wrapped pointers to copy()
thrust::copy(wrapped_src, wrapped_src + num_array_elts, wrapped_dst);

有关推力的其他信息,请参阅QuickStart指南。

答案 1 :(得分:0)

如果你知道2个数组的类型,这个问题变得相当简单。

__global__ kernel(float* dest, int* src){

    int idx=blockIdx.x*blockDim.x+threadIdx.x;
    dest[ idx ] = src[ idx ];

}

如果你的dest数组使用了更大的单词,例如一个双,这仍然有效,不需要知道字节数。使用cudamalloc时,请确保分配正确的字节数。