我是 CUDA 的新手,感谢您的帮助,并希望您能帮助我。
我需要将二维数组的多个元素存储到向量中,然后使用该向量,但是我的代码不能很好地工作,当我调试时,我发现在设备中使用cudaMallocPitch
分配二维数组时出现错误并使用 cudaMemcpy2D
复制到该数组。这是我的代码:
#include <stdio.h>
#include <cuda.h>
#include <cuda_runtime.h>
#include <cmath>
#define maxThreads 96
__global__ void extract(int mSize, float* dev_vector, float* dev_matrix, int N)
{
int idx = threadIdx.x + blockIdx.x * blockDim.x;
while(idx<N)
{
dev_vector[idx] = *(dev_matrix+(mSize*idx+N));
idx += blockDim.x * gridDim.x;
}
}
int main()
{
//CPU variables
int mSize = 5;
float* matrix;
int N = 4; // Vector size
int i,j;
float* vector;
int blocks, threads;
float* dev_matrix;
float* dev_vector;
blocks = 1+((N-1)/maxThreads);
threads = 1+((N-1)/blocks);
unsigned long int pitch;
unsigned long int memsize_vector = N*sizeof(float);
unsigned long int memsize_matrix = mSize*sizeof(float);
matrix = new float[memsize_matrix*memsize_matrix];
vector = new float[memsize_vector];
//Create 2D array
for(i=0; i<mSize; i++)
for(j=0; j<mSize; j++)
{
matrix[i+mSize*j] = ((i+1)+(j+1));
}
printf("\n");
for (i=0; i<mSize; i++){
for(j=0; j<mSize; j++){
printf("% 1.5f ", matrix[i+mSize*j]);
}
printf("\n");
}
printf("\n");
cudaMallocPitch((void **)&dev_matrix, &pitch, memsize_matrix, mSize);
cudaMalloc((void **)&dev_vector, memsize_vector);
cudaMemcpy2D(dev_matrix, pitch, matrix, memsize_matrix, memsize_matrix, mSize,
cudaMemcpyHostToDevice);
extract<<<blocks,threads>>>(mSize, dev_vector, dev_matrix, N);
cudaDeviceSynchronize();
cudaMemcpy(vector, dev_vector, memsize_vector, cudaMemcpyDeviceToHost);
printf("Vector values are:\n");
for(i=0; i<N; i++)
printf(" % 1.5f ", vector[i]);
printf("\n");
cudaFree(dev_matrix);
cudaFree(dev_vector);
}
最佳答案
此代码中存在很多问题,包括但不限于在代码中的多个位置交替使用以字节为单位的数组大小和字大小、使用不正确的类型(请注意 size_t
的存在有一个很好的理由)、潜在的截断和类型转换问题等等。
但核心问题是内核内部的音调内存的寻址,您甚至从未将音调值传递给该内存。阅读documentation for cudaMallocPitch
将为您提供在内核内寻址倾斜内存的正确方法。您的内核可能如下所示:
__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;
}
}
[免责声明:从未编译或测试,使用风险自负]。
您将必须修复主机代码中的所有问题,以反射(reflect)您所做的任何内核更改。
关于cuda - 使用 cudaMallocPitch 分配 2D 数组并使用 cudaMemcpy2D 复制,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14991667/