Почему z всегда равен нулю в ядре CUDA
Я использую Cudafy, чтобы сделать некоторые вычисления на GPU NVIDIA. (Quadro K1100M 3.0, если это имеет значение)
Мой вопрос, когда я использую следующее
cudaGpu.Launch(new dim3(44,8,num), new dim(8, 8)).MyKernel...
почему мои z-индексы из экземпляра GThread всегда равны нулю, когда я использую это в моем ядре?
int z = thread.blockIdx.z * thread.blockDim.z + thread.threadIdx.z;
Кроме того, если я должен сделать что-то вроде
cudaGpu.Launch(new dim3(44,8,num), new dim(8, 8, num)).MyKernel...
z дает разные индексы, как и должно быть, но num не может быть очень большим из-за ограничений на количество потоков в блоке. Любой всплеск того, как обойти это?
редактировать
Еще один способ выразить это. Могу ли я использовать thread.z в моем ядре (для чего-нибудь полезного), когда размер блока только 2D?
1 ответ
На всех поддерживаемых в настоящее время аппаратных средствах CUDA позволяет использовать как трехмерные сетки, так и трехмерные блоки. На устройствах с вычислительными возможностями 1.x (которые больше не поддерживаются) сетки были ограничены двумя измерениями.
Однако CUDAfy в настоящее время использует устаревшую функцию API времени выполнения для запуска ядер и молча использует только gridDim.x и gridDim.y, не принимая во внимание gridDim.z:
_cuda.Launch(function, gridSize.x, gridSize.y);
Как видно из функции DoLaunch() в CudaGPU.cs.
Таким образом, хотя вы можете указать трехмерную сетку в CUDAfy, третье измерение игнорируется при запуске ядра. Спасибо Флорент за указание на это!