Я просто складываю 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