内核

时间:2015-12-07 08:09:00

标签: arrays cuda

我见过很多关于它的问题,但没有一个能解决我的问题。

我将一个大小为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;之类的音调,但是没有设法得到更好的结果。我究竟做错了什么?请帮忙!

2 个答案:

答案 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; 找出索引是否合乎逻辑。