使用cudaMallocPitch分配2D数组并使用cudaMemcpy2D进行复制

时间:2013-02-20 23:10:41

标签: cuda

我是CUDA的新手,感谢您的帮助,希望您能帮助我。

我需要将2D数组的多个元素存储到一个向量中,然后使用向量,但是我的代码不能正常工作,当我调试时,我发现在设备中使用{分配2D数组时出错了{1}}并使用cudaMallocPitch复制到该数组。这是我的代码:

cudaMemcpy2D

3 个答案:

答案 0 :(得分:1)

此代码中存在批次问题,包括但不限于在代码中的多个位置使用字节和字大小互换使用不正确的类型(请注意size_t存在的原因非常充分),潜在的截断和类型铸造问题等等。

但核心问题是内核中的内存寻址,你甚至都没有传递音调值。读取cudaMallocPitch的{​​{3}}将为您提供正确的方法来解决内核中的内存。您的内核可能然后如下所示:

__global__ void extract(size_t mpitch, float* dev_vector, float* dev_matrix, int N)
{
    int idx = threadIdx.x + blockIdx.x * blockDim.x;
    int stride = blockDim.x * gridDim.x;

    while(idx<N)
    {          
        dev_vector[idx] = *(float *)( ((char*)dev_matrix + idx * mpitch) + N );
        idx += stride;
    }
}

[免责声明:从未编译或测试过,请自担风险使用]。

您必须解决主机代码中的所有问题,以反映您所做的任何内核更改。

答案 1 :(得分:0)

你真的想要声明一个长度为[memsizeMatrix * memsizeMatrix]的源矩阵吗?

这将分配400个浮点数或1600个字节。这意味着您的源音高已关闭,而Memcpy2D调用失败。

我假设你想说

matrix = new float[mSize*mSize];

答案 2 :(得分:0)

感谢所有人,Alex我没有看到,并修复它,谢谢。

talonmies,谢谢你,我的代码是有效的,有你的建议。非常感谢,最后是我的内核:

__global__ void sumreduct(size_t pitch, float* dev_vector, float* dev_matrix, int  columns, int N)
{
int idx = threadIdx.x + blockIdx.x * blockDim.x;
int stride = blockDim.x * gridDim.x;

while(idx<N)
{
    dev_vector[idx] = *(float *)( ((char*)dev_matrix + idx * pitch) + columns);
    idx += stride;
} 
}

关于“size_t”,我使用的是“Unsigned int”,因为Nsight向我显示了下一个警告:

无法解析类型'size_t'

由于