使用cudaMallocPitch分配2D阵列,并使用cudaMemcpy2D进行复制

使用cudaMallocPitch分配2D阵列,并使用cudaMemcpy2D进行复制,cuda,Cuda,我是CUDA的新手,非常感谢您的帮助,希望您能帮助我 我需要将2D数组的多个元素存储到一个向量中,然后使用该向量,但我的代码工作不正常,调试时,我发现在设备中使用cudamallocitch分配2D数组并使用cudaMemcpy2D复制到该数组时出错。这是我的代码: #包括 #包括 #包括 #包括 #定义maxThreads 96 __全局无效提取(int mSize,float*dev\u向量,float*dev\u矩阵,int N) { int idx=threadIdx.x+blockId

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

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

#包括
#包括
#包括
#包括
#定义maxThreads 96
__全局无效提取(int mSize,float*dev\u向量,float*dev\u矩阵,int N)
{
int idx=threadIdx.x+blockIdx.x*blockDim.x;

而(idx你真的想声明一个长度为[memsizeMatrix*memsizeMatrix]的源矩阵吗

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

我想你是想说

matrix = new float[mSize*mSize];
这段代码中有很多问题,包括但不限于在代码中的多个位置交替使用字节数组大小和字大小,使用不正确的类型(请注意,
size\t
存在的原因非常充分),潜在的截断和类型转换问题,等等

但核心问题是内核内的倾斜内存寻址,您甚至从未向其传递倾斜值。读取for
cudamallocpatch
将为您提供内核内倾斜内存寻址的正确方法。您的内核可能如下所示:

__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;
    }
}
\uuuuu全局\uuuuuu无效提取(大小为mpitch,浮点*偏差向量,浮点*偏差矩阵,整数N)
{
int idx=threadIdx.x+blockIdx.x*blockDim.x;
int stride=blockDim.x*gridDim.x;

(idx多亏了大家,亚历克斯,我还没有看到这个,修复它,谢谢

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;
} 
}
\uuuuu全局\uuuuuu无效sumreduct(大小\u t间距,浮点*偏差向量,浮点*偏差矩阵,int列,int N)
{
int idx=threadIdx.x+blockIdx.x*blockDim.x;
int stride=blockDim.x*gridDim.x;

while(idx)“查找分配2D数组中的错误”是什么意思?是否尝试检查CUDA API调用错误?