Вы используете измерение y, что означает, что вы используете потоки 2D-массива, поэтому вы не можете вызывать ядро только с:
int numBlock = 30;
int numThreadsPerBlock = 500;
fun<<<numBlock,numThreadsPerBlock>>>()
Вызов должен быть: (Обратите внимание, что теперь у блоков есть 2D-потоки)
dim3 dimGrid(GRID_SIZE, GRID_SIZE); // 2D Grids with size = GRID_SIZE*GRID_SIZE
dim3 dimBlocks(BLOCK_SIZE, BLOCK_SIZE); //2D Blocks with size = BLOCK_SIZE*BLOCK_SIZE
fun<<<dimGrid, dimBlocks>>>()
См. Руководство по программированию CUDA для получения дополнительной информации, а также, если вы хотите создать 2D-массив или 3D, лучше использовать cudaMalloc3D или cudaMallocPitch
Что касается вашего кода, Я думаю, что это сработает (но я не пробовал, хотя, надеюсь, вы можете ухватить идею с этим):
//main
dim3 dimGrid(1, 1); // 2D Grids with size = 1
dim3 dimBlocks(Width, Height); //2D Blocks with size = Height*Width
fun<<<dimGrid, dimBlocks>>>(Width, Height)
//kernel
__global__ void fun(int Width, int Height)
{
int i = blockIdx.x * blockDim.x + threadIdx.x;
int j = blockIdx.y * blockDim.y + threadIdx.y;
if((i < Width)&&(j<Height))
{
//CODE of function
}
}