使用cudaMallocPitch分配2D阵列,并使用cudaMemcpy2D进行复制
我是CUDA的新手,非常感谢您的帮助,希望您能帮助我 我需要将2D数组的多个元素存储到一个向量中,然后使用该向量,但我的代码工作不正常,调试时,我发现在设备中使用使用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
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
存在的原因非常充分),潜在的截断和类型转换问题,等等
但核心问题是内核内的倾斜内存寻址,您甚至从未向其传递倾斜值。读取forcudamallocpatch
将为您提供内核内倾斜内存寻址的正确方法。您的内核可能如下所示:
__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调用错误?