Tengo un kernel que llama a dispositivo dentro de una sentencia if. El código es el siguiente:CUDA: Llamar a una función __device__ desde un kernel
__device__ void SetValues(int *ptr,int id)
{
if(ptr[threadIdx.x]==id) //question related to here
ptr[threadIdx.x]++;
}
__global__ void Kernel(int *ptr)
{
if(threadIdx.x<2)
SetValues(ptr,threadIdx.x);
}
En los hilos del núcleo 0-1 setValues de llamadas al mismo tiempo. ¿Qué pasa después de eso? Quiero decir que ahora hay 2 llamadas concurrentes a SetValues. ¿Cada llamada de función se ejecuta en serie? ¿Entonces se comportan como 2 llamadas a la función kernel?
tengo una tarjeta fermi. ¿Esto significa que la función no está en línea? por lo tanto, el threadIdx.x en SetValues son todos los hilos y no solo los hilos 0 y 1? – scatman
Las funciones todavía están en línea por defecto en Fermi. Creo que entiendo de lo que realmente está preguntando ahora, cuál es el alcance de las variables de subproceso integradas (como threadIdx) dentro de las funciones de __device__. ¿Me estoy calentando? – talonmies
sí, esa es mi pregunta. pero como las funciones de __device__ están en línea ... entonces supongo que el alcance de los hilos es el mismo que se usa usando <<< bloques, hilos >>> pero debido a la rama solo los hilos 0 y 1 ejecutan ptr [threadIdx.x] ++. ¿es esto correcto? – scatman