Memory management 将Typename1的Cuda数组1转换为Typename2的数组2

Memory management 将Typename1的Cuda数组1转换为Typename2的数组2,memory-management,cuda,Memory Management,Cuda,亲爱的Cuda学者们, 正在寻找以下问题的解决方案 a) 我有两个数组 1) 尺寸为1的阵列1,类型为Name1 2) 数组2,大小为1,类型为2 b) 我想编写以下原型的内核 __全局内核(void*dest、void*src、int-dest\u-sizeoftype、int-src\u-sizeoftype、int-num\u-array\elts); c) 假设我创建num_array_elts cuda线程,每个线程将其elt从src复制到目标 问题: a) 我遇到的问题是在内核中

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

a) 我有两个数组 1) 尺寸为1的阵列1,类型为Name1 2) 数组2,大小为1,类型为2

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


__全局内核(void*dest、void*src、int-dest\u-sizeoftype、int-src\u-sizeoftype、int-num\u-array\elts);

c) 假设我创建num_array_elts cuda线程,每个线程将其elt从src复制到目标

问题: a) 我遇到的问题是在内核中使用哪个函数将num_字节从src复制到dest

先谢谢你 当做
Nagaraju

中的
复制
算法使这一过程变得简单

#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);
#包括
#包括
int*src=。。。
浮点*dst=。。。
//首先包装“原始”指针
推力::装置_ptr包裹_src(src);
推力:装置ptr缠绕式(dst);
//然后将包装好的指针传递给copy()
推力:复制(包裹的src、包裹的src+num数组elts、包裹的dst);

有关推力的更多信息,请参阅指南。

如果您知道这两个阵列的类型,那么这个问题就变得相当简单了

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

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

}

如果您的dest数组使用了较大的字,例如double,这仍然有效,并且不需要知道字节数。请确保在使用时分配了正确的字节数。

有时cuda不支持double,我也可以将其用于double吗?如果src是双精度的,而dst是短的,那么情况就是。。。谢谢。如果CUDA设备支持,上述代码将适用于Double。原则上,您可以在早期的设备上(计算能力1.0和1.1)将双打转换为短打,但这将是困难和耗时的。