2010-09-05 16 views
50

¿CUDA es compatible con la recursividad?¿CUDA es compatible con la recursión?

+0

Tenga en cuenta que todos los bucles implican recursividad, y la recursividad final no implica/no debería implicar una llamada de función recursiva. – Potatoswatter

+4

Consulte [aquí] (http://stackoverflow.com/q/3644809/1129194) para obtener más información –

Respuesta

45

Lo hace en hardware NVIDIA apoyar la capacidad de cómputo 2.0 y CUDA 3.1:

nuevas características del lenguaje añadido a CUDA C /C++ incluye:

Ayuda para la función punteros y recursión facilite para portar muchos algoritmos existentes a GPU de Fermi

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

punteros de función: http://developer.download.nvidia.com/compute/cuda/sdk/website/CUDA_Advanced_Topics.html#FunctionPointers

Recursión: no puedo encontrar un ejemplo de código en el sitio web de NVIDIA, pero en el forum alguien publicar esto:

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

Tener hardware "reciente" no es suficiente. No todas las tarjetas recientes son Fermi (también conocida como capacidad de cálculo 2.0). En la actualidad, no hay GPU móviles Fermi. –

+0

Tienes razón, actualicé mi impresora. Pero, ¿qué hay de Geforce GTX 480M? Hay un chip de Fermi adentro. – Stringer

+0

Hay computadoras portátiles con Fermi; Geforce 480M y Quadro FX5000M han estado fuera por un tiempo. – Tom

2

Cualquier algoritmo recursivo se puede implementar con una pila y un bucle. Es mucho más doloroso, pero si realmente necesitas recursividad, esto puede funcionar.

11

Sí, ver la NVIDIA CUDA Programming Guide: solamente

dispositivo funciones recursión apoyo en código de dispositivo compilado para dispositivos de la capacidad de cálculo 2.0.

Necesita una tarjeta Fermi para usarlos.

2

CUDA 3.1 admite la recursión

+0

tiene un ejemplo? – JuanPablo

8

Aunque solo admite recursividad para chips específicos, a veces puede salirse con la recursión "emulada": see how I used compile-time recursion for my CUDA raytracer.

+0

¡Muy útil! Kudos –

+0

Creo que esto genera códigos más rápidos que la recursión real. –

+0

@Min Lin: Ahh, pero ¿cómo es que mi comentario todavía está en 1, entonces? ¡Me debes un favor! :-) – ttsiodras

-2

Intenté recién ahora en mi pc con una GPU NVIDIA con capacidad de cálculo de 1.1. Dice que la recurrencia aún no es compatible. Así que no tiene nada que ver con el tiempo de ejecución sino con el hardware

6

En la versión CUDA 4.1, CUDA admite la recursión solo para la función __device__ pero no para la función __global__.

3

Claro que sí, pero requiere la arquitectura de Kepler para hacerlo. Echa un vistazo a su último ejemplo en la clasificación rápida clásica.

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

Por lo que yo sé, sólo el último Kepler GK110 soporta paralelismo dinámico, que permite este tipo de llamada recursiva y desove de nuevos temas dentro del kernel. Antes de Kepler GK110, no fue posible. Y tenga en cuenta que no toda la arquitectura Kepler es compatible con esto, solo GK110 lo hace.

Si necesita recursión, probablemente necesite el Tesla K20. No estoy seguro de si Fermi lo admite, nunca lo lea.: \ Pero Kepler seguro sí. =)

1

Si su algoritmo incluye muchas recurrencias, soporte o no, no está diseñado para GPU, rediseñe sus algorthims o consiga una mejor CPU, de cualquier forma será mejor (apuesto en muchos casos, maginitudes mejor) luego hacer repeticiones en GPU.

5

Sólo después de 2.0 capacidad de cómputo en dispositivos compatibles

0

Sí, se apoya en la versión actual. Pero a pesar de que es posible ejecutar funciones recursivas, debe tener en cuenta que la asignación de memoria de la pila de ejecución no se puede predecir (la función recursiva se debe ejecutar para conocer la profundidad real de la recursión), por lo que su pila podría resultar insuficiente para sus propósitos y podría necesitar un incremento manual del tamaño de pila predeterminado