Почему 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, третье измерение игнорируется при запуске ядра. Спасибо Флорент за указание на это!

Другие вопросы по тегам