it-swarm.dev

Поддерживает ли CUDA рекурсию?

Поддерживает ли CUDA рекурсию?

53
JuanPablo

Это делается на оборудовании NVIDIA, поддерживающем вычислительные возможности 2.0 и CUDA 3.1:

Новые функции языка добавлены в CUDA C/ C++ include:

Поддержка функции указатели и рекурсия облегчают перенести многие существующие алгоритмы на Графические процессоры Fermi

http://developer.nvidia.com/object/cuda_3_1_downloads.html

Указатели на функции:http://developer.download.nvidia.com/compute/cuda/sdk/website/CUDA_Advanced_Topics.html#FunctionPointers

Рекурсия: Я не могу найти пример кода на веб-сайте NVIDIA, но на форуме кто-то опубликовал это:

__device__ int fact(int f)
{
  if (f == 0)
    return 1;
  else
    return f * fact(f - 1);
}
46
Stringer

Да, см. Руководство по программированию NVIDIA CUDA :

Функции device поддерживают рекурсию только в коде устройства, скомпилированном для устройств вычислительных возможностей 2.0.

Вам нужна карта Ферми, чтобы использовать их.

12
Matias Valdenegro

Несмотря на то, что он поддерживает рекурсию только для определенных микросхем, иногда вы можете избежать «эмулированной» рекурсии: посмотрите, как я использовал рекурсию во время компиляции для моего CUDA raytracer .

9
ttsiodras

В выпуске CUDA 4.1 CUDA поддерживает рекурсию только для функции __device__, но не для функции __global__.

7
username_4567

Только после 2.0 вычислительных возможностей на совместимых устройствах

5
Arturo Garcia

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

http://blogs.nvidia.com/2012/09/how-tesla-k20-speeds-up-quicksort-a-familiar-comp-sci-code/

Насколько я знаю, только последний Kepler GK110 поддерживает динамический параллелизм, который допускает такой рекурсивный вызов и порождение новых потоков в ядре. До Kepler GK110 это было невозможно. И обратите внимание, что не вся архитектура Kepler поддерживает это, только GK110.

Если вам нужна рекурсия, вам, вероятно, нужен Tesla K20 .... Я не уверен, поддерживает ли Fermi его, никогда не читал об этом. :\ Но Кеплер точно знает. знак равно

3
Hong Zhou

CUDA 3.1 поддерживает рекурсию

2
Jan C

Любой рекурсивный алгоритм может быть реализован с помощью стека и цикла. Это больше боли, но если вам действительно нужна рекурсия, это может сработать.

2
dicroce

Если ваш алгоритм включает много рекурсий, то поддерживает или нет, он не предназначен для графических процессоров, либо перепроектируйте ваши algorthims, либо получите лучший процессор, в любом случае он будет лучше (я уверен, что во многих случаях лучше), чем делать рекурсии на Графические процессоры.

1
user0002128

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

0
Mr.PotatusVII

Да, он поддерживает рекурсию. Однако не стоит делать рекурсию на GPU. Потому что каждый поток собирается это сделать.

0
palebluedot