recursion - ventajas - recursividad en programacion c++
CUDA__syncthreads() y recursiĆ³n (3)
Quiero usar __syncthreads () para una recursión como
__device__ void foo(int k) {
if (some_condition) {
for (int i=0;i<8;i++) {
foo(i+k); // foo might take longer with some inputs
__syncthreads();
}
}
}
¿Cómo se aplica ahora este __syncthreads ()? Sé que solo se aplica dentro de un bloque. Por lo que yo entiendo, esto se aplica a todos los hilos locales independientemente de la profundidad de recursión? Pero, ¿y si quisiera asegurarme de que este __syncthreads () tenga una cierta profundidad de recursión? ¿Es eso posible? Podría verificar la profundidad de recursión, pero creo que tampoco funcionará.
¿Hay alternativas posibles?
He visto que hay 3 extensiones sincruce para el dispositivo CUDA> = 2.0
int __syncthreads_count(int predicate);
int __syncthreads_and(int predicate);
int __syncthreads_or(int predicate);
Pero no creo que ayuden, ya que parecen un contador atómico.
Como sabe, __syncthreads()
solo es seguro donde todos los hilos dentro de un bloque alcanzan la barrera. Esto significa que si llama a __syncthreads()
desde una condición, la condición debe evaluarse de la misma manera en todos los hilos dentro de un bloque.
Para __syncthreads()
dentro de la recursión, esto significa que todos los hilos dentro de un bloque deben ejecutar la recursión a la misma profundidad, de lo contrario, no todos los hilos llegarán a la misma barrera.
Por supuesto, lo que dijiste sobre __syncthreads () es verdadero, solo funciona para hilos locales dentro de los bloques, por lo tanto no tienes control sobre lo que está sucediendo en otros bloques. La mejor forma de reducción es hacer primero una reducción para toda la matriz que generalizará una matriz igual al tamaño de los bloques. Luego, no copie la matriz nuevamente en el Host sino que llame a otra reducción que tendrá 1 bloque y subprocesos similares a la cantidad de bloques en la llamada anterior y luego copiará la matriz de tamaño 1 de Dispositivo a Anfitrión. pero asegúrese de usar cudaThreadSynchronize () entre dos llamadas coz, a menos que se genere la primera reducción, puede hacer esta reducción. esto es una reducción de dos pasos pero funciona para mí.
¡¡¡aclamaciones!!! saif
¿Hay alternativas posibles?
Sí, no use el paradigma de recursión para expresar su lógica de función