1

.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
}

在此处输入图像描述

4

2 回答 2

3

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

struct __builtin_align__(16) ulong4
{
  unsigned long int x, y, z, w;
};

这意味着您要用于填充流的四个连续 32 位无符号源整数的流ulong4大小相同。最简单的解决方案包含在您发布的图像上的文本中 - 只需将指针强制转换(隐式或显式)unsigned int指向ulong4指针,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;   
}

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

于 2013-11-04T10:59:11.697 回答
2

这应该敲响所有警钟:

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

您在设备上分配 UA,然后在主机代码中使用它。永远不要那样做。您将需要使用cudaMemcpy将阵列复制到设备。本教程向您展示了一个使用 cudaMemcpy 复制内容的基本程序。cudaMemcpy 的长度参数是以字节为单位的数组长度。在你的情况下是VECTOR_SIZE * sizeof(unsigned int).

于 2013-11-04T03:25:26.637 回答