我见过很多关于它的问题,但没有一个能解决我的问题。
我将一个大小为n x n的初始化数组复制到全局设备内存中作为2D数组,运行一些内核并将其复制回来:
int image_width = 5;
int image_height = 4;
int n = image_height*image_width;
int *G = (int *) malloc (sizeof(int) * n*n);
size_t pitch;
int *dev_d = 0;
for (int x =0; x<n*n;x++) G[x] = 9;
cudaError_t cudaStatus = cudaMallocPitch(&dev_d, &pitch, n * sizeof(int), n);
cudaStatus = cudaMemcpy2D(dev_d, pitch, G, n * sizeof(int), n * sizeof(int), n, cudaMemcpyHostToDevice); //A
setup_adjacency_matrix<<<4, 2>>>(n, dev_d, image_width,pitch);
cudaStatus = cudaMemcpy2D(d, n * sizeof(int), dev_d, pitch, n * sizeof(int), n, CMCPYDTH); //copy back //B
HANDLE_ERROR(cudaStatus);
出于测试目的,我只想要4块2个线程。测试内核本身也没有做任何特别的事情:
__global__ void setup_adjacency_matrix(
const unsigned int V, int * const d,const unsigned int image_width,size_t pitch){
d[blockIdx.x*V+threadIdx.x] = blockIdx.x*100+threadIdx.x; //problem here?
}
但是第一个块中的唯一线程似乎影响了数组,结果是:
0 1 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9
9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9
9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9
9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9
9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9
9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9
9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9
9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9
9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9
9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9
9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9
9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9
9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9
9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9
9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9
9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9
9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9
9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9
9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9
9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9
当我使用1d数组并在A行和B行中进行复制时,一切正常:
cudaMemcpy(dev_d, G, n * sizeof(int)* n, cudaMemcpyHostToDevice); //A
cudaStatus = cudaMemcpy(d, dev_d, n * sizeof(int)* n, CMCPYDTH); //B
但我想学习使用2D阵列!
我猜测我计算数组元素地址的方式是错误的,我也尝试将它乘以d[blockIdx.x*V*pitch+threadIdx.x] = blockIdx.x*100+threadIdx.x;
之类的音调,但是没有设法得到更好的结果。我究竟做错了什么?请帮忙!
答案 0 :(得分:1)
d[blockIdx.x*(pitch/sizeof(int))+threadIdx.x] = blockIdx.x*100+threadIdx.x;
这似乎按预期工作......虽然我不确定为什么......:)
答案 1 :(得分:0)
我认为您的参数中的数据类型与您输入的内容之间可能存在不匹配。
试试这个。
__global__ void setup_adjacency_matrix(
const int V, int *d,int image_width,size_t pitch){
d[blockIdx.x*V+threadIdx.x] = blockIdx.x*100+threadIdx.x;
}
如果它需要不同的数字类型,那么它可能会导致问题。
通常,如果您想对同一个初始数据执行多个操作,请创建输入和输出数组。
你也可以进行另一次内存分配和输出 int IndexValue = blockIdx.x * V + threadIdx.x; 找出索引是否合乎逻辑。