Массив переменных размеров в CUDA - PullRequest
1 голос
/ 25 ноября 2011

Есть ли способ объявить массив, такой как:

int arraySize = 10;
int array[arraySize];

внутри ядра / функции CUDA?В другом посте я прочитал, что я могу объявить размер разделяемой памяти в вызове ядра, и тогда я смогу сделать:

int array[];

Но я не могу этого сделать.Я получаю ошибку компиляции: «неполный тип не допускается».Кроме того, я также прочитал, что printf () может быть вызван из потока, и это также выдает ошибку: «Невозможно вызвать функцию хоста из устройства / глобальной функции».

Могу ли я что-нибудь сделать для создания массива переменного размера или эквивалентного в CUDA?У меня есть вычислительная способность 1.1, это как-то связано с этим?Могу ли я обойти объявления массива переменного размера из потока, определив typedef struct, который имеет переменную размера, которую я могу установить?Решения для вычислительных возможностей помимо 1.1 приветствуются.Это для командного проекта класса, и если есть хоть какой-то способ сделать это, я могу хотя бы представить эту информацию.

Ответы [ 2 ]

2 голосов
/ 25 ноября 2011

Насчет printf, проблема в том, что он работает только для вычислительных возможностей 2.x. Есть альтернативный вариант cuPrintf, который вы можете попробовать.

Для выделения массивов переменного размера в CUDA вы делаете это так:

  • Внутри ядра вы пишете extern __shared__ int[];
  • При вызове ядра вы передаете в качестве третьего параметра запуска размер общей памяти в байтах, такой как mykernel<<<gridsize, blocksize, sharedmemsize>>>();

Это объясняется в Руководстве по программированию CUDA C в разделе B.2.3 относительно спецификатора __shared__.

0 голосов
/ 25 ноября 2011

Если ваши массивы могут быть большими, одним из решений было бы иметь одно ядро, которое вычисляет требуемые размеры массивов, сохраняет их в массиве, а затем после этого вызова хост выделяет необходимые массивы и передает массив указателей напотоков, а затем вы выполняете вычисления как второе ядро.

Помогает ли это, зависит от того, что вы должны сделать, потому что это будут массивы, размещенные в глобальной памяти.Если общий размер (на блок) ваших массивов меньше размера доступной разделяемой памяти, у вас может быть достаточно большой массив разделяемой памяти, и ваши потоки могут разделить его между собой.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...