我只是在结果数组中添加一个2D数组(4x4),但是在输出中我只得到第一行,而其他3行返回一些垃圾值。 我猜可能是由于不确定网格大小和块大小的分配所致。 因为我是Cuda的新手,所以请引导我。
如果我的提问方式有问题,请纠正我,因为我是新来的。
__global__ void d_EdgeDetect(float *org, float * result)
{
int row = blockIdx.x * blockDim.x + threadIdx.x;
int col = blockIdx.y * blockDim.y + threadIdx.y;
//int row = threadIdx.x;
//i**strong text**nt col = threadIdx.y;
int height = 4;
int width = 4;
if (row < height && col < width)
{
int index = col + row * 4;
result[index] = org[index] + org[index];
}
}
int wdth = 4;
int height = 4;
int rng = 100;
/* ******MAIN ***** */
int main(int argc, char ** argv)
{
printf(" Starting program \n");
int size = wdth * height;
float * input = new float[size];
float * output = new float[size];
std::cout << "Input is: " << std::endl;
for (int i = 0; i < size; i++)
{
input[i] = rand() % rng;
std::cout << "at: " << i << " " << input[i] << std::endl;
}
float *dinput, *doutput;
cudaMalloc((void **)& dinput, size * sizeof(float));
cudaMalloc((void **)& doutput, size * sizeof(float));
cudaMemcpy(dinput, input, size, cudaMemcpyHostToDevice);
/* ******************** END setup work *************************** */
/* ******************* Device processing ********** */
dim3 blocksize(4, 4);
dim3 gridsize(4,4);
printf(" Invoking Kernel \n");
/* CUDA method */
d_EdgeDetect << < gridsize, blocksize >> > (dinput, doutput/*, dwdth, dheight*/);
cudaThreadSynchronize();
printf(" Completed Kernel \n");
cudaMemcpy(output, doutput, size,cudaMemcpyDeviceToHost);
for (int i = 0; i < size; i++)
{
std::cout << "at: " << i << " " << output[i] << std::endl;
}
/* ************* END Device processing **************** */
}
以下是代码的输出:
--------------------
at: 0 82
at: 1 134
at: 2 68
at: 3 0
at: 4 -4.31602e+08
at: 5 -4.31602e+08
at: 6 -4.31602e+08
at: 7 -4.31602e+08
at: 8 -4.31602e+08
at: 9 -4.31602e+08
at: 10 -4.31602e+08
at: 11 -4.31602e+08
at: 12 -4.31602e+08
at: 13 -4.31602e+08
at: 14 -4.31602e+08
at: 15 -4.31602e+08
答案 0 :(得分:0)
cudaMemcpy(dinput, input, size, cudaMemcpyHostToDevice);
您忘记添加要复制的数据的大小。
cudaMemcpy(dinput, input, size * sizeof(float), cudaMemcpyHostToDevice);
(而且,这几乎是C代码,您甚至不时使用printf
,没有用于存储数据的容器...)。
答案 1 :(得分:0)
从cudaMemcpy文档中,您可以看到原型中的count
是您要复制的字节总数。
cudaMemcpy ( void* dst, const void* src, size_t count, cudaMemcpyKind kind )
但是您仅复制了size
个字节(即16个字节),因此只有output
数组的前四个元素可以正确打印。
将size
与sizeof(float)
相乘,以便您将复制并能够正确打印output
数组的所有元素。