параметр функции ядра как const - PullRequest
2 голосов
/ 06 октября 2010

говорят, что у меня есть ядро ​​

foo(int a, int b)
{
    __shared__ int array[a];
}

кажется, что это должно быть постоянное значение, я добавил const перед int. Это не сработало, есть идеи?

foo(const int a, const int b)
{
    __shared__ int array[a];
}

Ответы [ 5 ]

5 голосов
/ 07 октября 2010

Хотя вы не можете иметь динамически изменяемый массив из-за ограничений языка C (как упоминалось в других ответах), то, что вы можете сделать в CUDA, выглядит примерно так:при условии, что вы сообщаете CUDA, сколько разделяемой памяти вы хотите во время вызова ядра, например:

testShmem<<<grid, block, 1024>>>( pdata, 1024 );
3 голосов
/ 06 октября 2010

В ISO C ++ размер массива должен быть так называемым константным выражением . Это сильнее, чем константная переменная. Это в основном означает постоянная времени компиляции . Таким образом, значение должно быть известно во время компиляции.

В ISO C90 это также имело место. C99 добавил VLA, массивы переменной длины, которые позволяют определять размер во время выполнения. Оператор sizeof для этих VLA становится оператором времени выполнения.

Я не знаком с CUDA или синтаксисом __shared__. Мне не ясно, почему / как вы используете термин kernel . Но я думаю, что правила схожи с W.r.t. константные выражения и массивы.

3 голосов
/ 06 октября 2010

Я не думаю, что CUDA или OpenCL позволяют динамически распределять разделяемую память. Вместо этого используйте макрос #define.

Если вам нужен массив динамического размера для каждой программы, вы можете предоставить его, используя -D MYMACRO (с OpenCL, я не знаю для CUDA). См. ответ Бахбара .

1 голос
/ 09 октября 2010

Вот как вы можете статически выделить __shared__ массив n значений в CUDA с использованием шаблонов C ++

template <int n>
kernel(...)
{
    __shared__ int array[n];
}

const int n = 128;
kernel<n><<<grid_size,block_size>>>(...);

Обратите внимание, что n должна быть известной константой в время компиляции , чтобы это работало. Если n не известен во время компиляции, вы должны использовать подход, предложенный Edric.

0 голосов
/ 06 октября 2010

Я подозреваю, что это вопрос языка C.

Если бы это был C ++, вы могли бы просто использовать std::vector.

void foo( int a, int b )
{
    std::vector<int> array( a );
    // ...
}

Если это действительно C ++, то то, какие функции C ++ вы можете использовать безопасно, может зависеть от среды. Непонятно, что вы подразумеваете под «ядром».

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