C++ 如何在CUDA中将数据从无符号整数复制到ulong4

C++ 如何在CUDA中将数据从无符号整数复制到ulong4,c++,cuda,memcpy,C++,Cuda,Memcpy,.h文件: #define VECTOR_SIZE 1024 .cpp文件: int main () { unsigned int* A; A = new unsigned int [VECTOR_SIZE]; CopyToDevice (A); } .cu文件: void CopyToDevice (unsigned int *A) { ulong4 *UA unsigned int VectorSizeUlong4 = VECTOR_SIZ

.h文件:

#define VECTOR_SIZE 1024   
.cpp文件:

int main ()
{
    unsigned int* A;
    A = new unsigned int [VECTOR_SIZE];

    CopyToDevice (A);
}
.cu文件:

void CopyToDevice (unsigned int *A)
{
    ulong4 *UA
    unsigned int VectorSizeUlong4 = VECTOR_SIZE / 4;
    unsigned int VectorSizeBytesUlong4 = VectorSizeUlong4 * sizeof(ulong4);

    cudaMalloc( (void**)&UA, VectorSizeBytesUlong4 );

    // how to use cudaMemcpy to copy data from A to UA?

    // I tried to do the following but it gave access violation error:
    for (int i=0; i<VectorSizeUlong4; ++i)
    {
        UA[i].x = A[i*4 + 0];
        UA[i].y = A[i*4 + 1];
        UA[i].z = A[i*4 + 2];
        UA[i].w = A[i*4 + 3];
    }
    // I also tried to copy *A to device and then work on it instead going back to CPU to access *A every time but this did not work again
}
void CopyToDevice(无符号int*A)
{
乌龙4*UA
unsigned int VectorSizeUlong4=向量大小/4;
无符号int-VectorSizeBytesUlong4=VectorSizeUlong4*sizeof(ulong4);
Cudamaloc((void**)和UA,VectorSizeBytesUlong4);
//如何使用cudaMemcpy将数据从A复制到UA?
//我尝试执行以下操作,但出现访问冲突错误:

对于(int i=0;i这将引起所有警报:

cudaMalloc( (void**)&UA, VectorSizeBytesUlong4 );
// ...
UA[i].x = A[i*4 + 0];

您正在设备上分配UA,然后在主机代码中使用它。永远不要这样做。您需要使用
cudaMemcpy
将数组复制到设备上。显示了一个使用cudaMemcpy复制内容的基本程序。cudaMemcpy的length参数是数组的长度(以字节为单位)。在您的情况下,这就是
VECTOR\u SIZE*sizeof(unsigned int)

这应该会引起所有的警钟:

cudaMalloc( (void**)&UA, VectorSizeBytesUlong4 );
// ...
UA[i].x = A[i*4 + 0];

您正在设备上分配UA,然后在主机代码中使用它。永远不要这样做。您需要使用
cudaMemcpy
将数组复制到设备上。显示了一个使用cudaMemcpy复制内容的基本程序。cudaMemcpy的length参数是数组的长度(以字节为单位)。在您的情况下,这就是
VECTOR\u SIZE*sizeof(unsigned int)
CUDA
ulong4
是一个16字节对齐的结构,定义为

struct __builtin_align__(16) ulong4
{
  unsigned long int x, y, z, w;
};
这意味着要用于填充
ulong4
流的四个连续32位无符号源整数流的大小相同。最简单的解决方案包含在您发布的图像上的文本中-仅强制转换(隐式或显式)指向
ulong4
指针的
unsigned int
指针,直接在主机和设备内存上使用
cudaMemcpy
,并将生成的设备指针传递给任何需要
ulong4
输入的内核函数。设备传递函数可能类似于:

ulong4* CopyToDevice (unsigned int* A)
{
    ulong4 *UA, *UA_h;
    size_t VectorSizeUlong4 = VECTOR_SIZE / 4;
    size_t VectorSizeBytesUlong4 = VectorSizeUlong4 * sizeof(ulong4);

    cudaMalloc( (void**)&UA, VectorSizeBytesUlong4);
    UA_h = reinterpret_cast<ulong4*>(A); // not necessary but increases transparency
    cudaMemcpy(UA, UA_h, VectorSizeBytesUlong4);

    return UA;   
}
ulong4*CopyToDevice(unsigned int*A)
{
ulong4*UA,*UA_h;
size_t VectorSizeUlong4=向量大小/4;
size_t VectorSizeBytesUlong4=VectorSizeUlong4*sizeof(ulong4);
Cudamaloc((void**)和UA,VectorSizeBytesUlong4);
UA_h=重新解释(A);//不需要,但增加了透明度
cudaMemcpy(UA、UA_h、VectorSizeBytesUlong4);
返回UA;
}

[通常免责声明:在浏览器中编写,未经测试或编译,使用风险自负]

CUDA
ulong4
是一个16字节对齐的结构,定义为

struct __builtin_align__(16) ulong4
{
  unsigned long int x, y, z, w;
};
这意味着要用于填充
ulong4
流的四个连续32位无符号源整数流的大小相同。最简单的解决方案包含在您发布的图像上的文本中-仅强制转换(隐式或显式)指向
ulong4
指针的
unsigned int
指针,直接在主机和设备内存上使用
cudaMemcpy
,并将生成的设备指针传递给任何需要
ulong4
输入的内核函数。设备传递函数可能类似于:

ulong4* CopyToDevice (unsigned int* A)
{
    ulong4 *UA, *UA_h;
    size_t VectorSizeUlong4 = VECTOR_SIZE / 4;
    size_t VectorSizeBytesUlong4 = VectorSizeUlong4 * sizeof(ulong4);

    cudaMalloc( (void**)&UA, VectorSizeBytesUlong4);
    UA_h = reinterpret_cast<ulong4*>(A); // not necessary but increases transparency
    cudaMemcpy(UA, UA_h, VectorSizeBytesUlong4);

    return UA;   
}
ulong4*CopyToDevice(unsigned int*A)
{
ulong4*UA,*UA_h;
size_t VectorSizeUlong4=向量大小/4;
size_t VectorSizeBytesUlong4=VectorSizeUlong4*sizeof(ulong4);
Cudamaloc((void**)和UA,VectorSizeBytesUlong4);
UA_h=重新解释(A);//不需要,但增加了透明度
cudaMemcpy(UA、UA_h、VectorSizeBytesUlong4);
返回UA;
}

[常见免责声明:使用浏览器编写,未经测试或编译,使用风险自负]

源和目标的总大小在代码中不相同。是否要执行元素到元素的复制?即使在这种情况下,源和目标中的元素数也不匹配。粗略的方法是先复制到大小相同的设备内存(例如
temp
)然后编写自己的内核从
temp
逐个复制到
UA
。源和目标的总大小在代码中不相同。是否要执行元素到元素的复制?即使在这种情况下,源和目标中的元素数也不匹配。粗略的方法是复制到相同大小的设备内存中首先调整大小(比如说
temp
),然后编写自己的内核从
temp
一个接一个地复制到
UA
。我认为
unsigned long
通常是64位(8字节)在64位操作系统机器上。我意识到它依赖于实现,所以我说的是一般术语。在64位linux机器上,根据我的经验,
sizeof(ulong4)
将是32,大小相当于8个32位的量。这对我来说,当从
无符号int
转换到
ulong4
时,会产生一个问题,你是只想扩展4个量,还是想将8个量打包到
ulong4
?@RobertCrovella:至少在MS平台上是这样(这是我所检查的全部内容),无符号长整型在32位和64位主机操作系统上都是32位的量。如果事实证明ulong4是64位的量,那么复制/分配内核可能最有意义。
UA_h=reinterpret_cast(a);
给出了错误:
转换为类型“ulong4”不允许
。因此我将其更改为
UA_h=reinterpret_cast(A);@Shibli:这是一个打字错误-正如我在免责声明中所说,我在broswerI中编写了此代码,我认为
无符号长
通常是64位(8字节)在64位操作系统机器上。我意识到它依赖于实现,所以我说的是一般术语。在64位linux机器上,根据我的经验,
sizeof(ulong4)
将是32,大小相当于8个32位的量。对于我来说,当从
无符号int
转换到
ulong4
时,这就引出了一个问题,您是只想扩展4个量,还是想将8个量打包成一个
ulong4