Почему z всегда равен нулю в ядре CUDA

Я использую Cudafy для выполнения некоторых расчетов на графическом процессоре 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?


person smok    schedule 25.04.2016    source источник
comment
0 может быть значением по умолчанию? Вы всегда должны указывать число со значением не менее 1. Чтобы справиться с ограничением потоков на блок, просто увеличьте количество блоков (таким образом, больше блоков меньше потоков).   -  person Taro    schedule 25.04.2016
comment
num было просто указать, что это может быть что угодно, но я уверен, что это › 0.   -  person smok    schedule 25.04.2016
comment
Я мало что знаю о cudafy, но может случиться так, что сопоставление между dot net и cuda, разработанное до того, как cuda разрешило измерение gridDim.z, не было обновлено и не учитывает измерение z. Хотя это требует проверки   -  person Florent DUGUET    schedule 26.04.2016
comment
После исследования я нашел только эту тему, в которой пользователь указывает, что CUDAfy сообщает о неправильном CC для его устройства: cudafy1.rssing.com/chan-12112480/all_p2.html . Возможно, из-за этого он думает, что * не может запустить трехмерную сетку, несмотря на то, что ваше устройство может.   -  person Taro    schedule 26.04.2016


Ответы (1)


На всем поддерживаемом в настоящее время оборудовании CUDA позволяет использовать как трехмерные сетки, так и трехмерные блоки. На устройствах с вычислительными возможностями 1.x (которые больше не поддерживаются) сетки были ограничены двумя измерениями.

Однако в настоящее время CUDAfy использует устаревшую функцию API времени выполнения для запуска ядер и молча использует только gridDim.x и gridDim.y, не принимая во внимание gridDim.z:

_cuda.Launch(function, gridSize.x, gridSize.y);

Как показано в функция DoLaunch() в CudaGPU.cs.

Таким образом, хотя вы можете указать трехмерную сетку в CUDAfy, третье измерение игнорируется во время запуска ядра. Спасибо Флорану за указание на это!

person Taro    schedule 26.04.2016
comment
Это не совсем правильно. Трехмерные сетки поддерживаются на всем оборудовании с CC›=2.0 (т. е. на всем оборудовании с поддержкой CUDA 7). - person talonmies; 26.04.2016
comment
В шпаргалке также есть примеры, где индексируется 3D-сетка блоков, но у меня никогда не было GPU Nvidia с поддержкой 3D-сетки блоков. Nsight всегда сообщал, что я могу запустить 65535 на 65535 на 1 блоков с различным количеством потоков в зависимости от графического процессора. - person Taro; 26.04.2016
comment
docs.nvidia.com/cuda/cuda- c-руководство по программированию/. Поддерживаются сетки 65535 x 65535 x 65535 или 2^31-1 для одномерных сеток для CC›=3 - person talonmies; 26.04.2016
comment
Если бы вы знали это, почему бы не подумать над ответом на вопрос от smok? В любом случае, я собираюсь отредактировать свой, чтобы исправить. - person Taro; 26.04.2016
comment
Потому что это не ответ на заданный вопрос, вот почему. Вопрос о CUDAFy.net. Я не знаю, какое дополнительное ограничение CUDAFy накладывает на параметры выполнения. Вполне может быть, что сам CUDAFy поддерживает только 2D-сетки. Но я не знаю, так ли это. И вы тоже. Вот почему это тоже не отвечает на вопрос. - person talonmies; 26.04.2016
comment
Нет, не знаю, но я могу поискать и, возможно, найти ответ. Если вы не хотите отвечать на вопрос от smok, пусть другие хотя бы попробуют. - person Taro; 26.04.2016
comment
@ Таро, я думаю, твой ответ хороший. Несмотря на то, что CUDA сейчас позволяет создавать трехмерные сетки, API CUDAfy может не использовать его, а использовать старый API ядра cuLaunchGrid docs.nvidia.com/cuda/cuda-driver-api/ . - person Florent DUGUET; 26.04.2016
comment
@FlorentDUGUE Может быть, но, чтобы быть уверенным, нам потребуется какая-то документация или существующие темы, говорящие об этом, но я действительно почти ничего не нашел по этой теме. - person Taro; 26.04.2016
comment
@Taro, заглянув в код CUDAfy, похоже, использует устаревший API среды выполнения CUDA, который разрешает только 2D-вызовы: cudafy.codeplex.com/SourceControl/latest#Cudafy/Cudafy.Host/ (DoLaunch). Только используя gridSize.x и gridSize.y. - person Florent DUGUET; 26.04.2016
comment
@FlorentDUGUET Приятно знать! Да, молча, используя только gridSize.x и y, а не z... Жаль, что это не задокументировано и не предупреждено... В любом случае, спасибо, что указали на это! - person Taro; 26.04.2016
comment
Я добавил это к своему ответу, указав, что вы были тем, кто нашел это и указал на это. Я думаю, что это поможет smok и другим пользователям, которые могли бы прочитать это в будущем. - person Taro; 26.04.2016
comment
Я считаю, что это отлично отвечает на мой вопрос. Надеюсь, Cudafy сможет исправить это, так как это действительно хороший инструмент. - person smok; 29.04.2016
comment
Рад, что это помогает. Это спасибо @FlorentDUGUET, который указал на это после того, как проник в источники CudaFy;) - person Taro; 29.04.2016