2012-09-27 9 views
28

¿Por qué ya no haya atomicAdd() en dobles sido implementados de manera explícita como parte de CUDA 4.0 o superior?¿Por qué no se ha implementado atomicAdd para dobles?

A partir del apéndice F Página 97 del CUDA programming guide 4.1 se han implementado las siguientes versiones de atomicAdd.

int atomicAdd(int* address, int val); 
unsigned int atomicAdd(unsigned int* address, 
         unsigned int val); 
unsigned long long int atomicAdd(unsigned long long int* address, 
           unsigned long long int val); 
float atomicAdd(float* address, float val) 

La misma página va a dar una pequeña aplicación de atomicAdd en dobles de la siguiente manera que acabo de comenzar a utilizar en mi proyecto.

__device__ double atomicAdd(double* address, double val) 
{ 
    unsigned long long int* address_as_ull = 
          (unsigned long long int*)address; 
    unsigned long long int old = *address_as_ull, assumed; 
    do { 
     assumed = old; 
old = atomicCAS(address_as_ull, assumed, 
         __double_as_longlong(val + 
           __longlong_as_double(assumed))); 
    } while (assumed != old); 
    return __longlong_as_double(old); 
} 

¿Por qué no definir el código anterior como parte de CUDA?

+2

Probablemente por lo que todos los usuarios de la misma es consciente de su implementación, ya que no es un sistema incorporado en la instrucción y la lógica de reintento puede estar sujeto a livelocks (ya que no hay garantía de equidad, un hilo puede quedar estancado durante el siempre que haya otros hilos actualizando la misma variable). – tera

Respuesta

31

Editar: A partir de CUDA 8, precisión doble atomicAdd() se implementa en CUDA con soporte de hardware en SM_6X (Pascal) GPU.

Actualmente, no hay dispositivos compatibles con CUDA atomicAdd para double en el hardware. Como se anotó, se puede implementar en términos de atomicCAS en enteros de 64 bits, pero hay un costo de rendimiento no trivial para eso.

Por lo tanto, el equipo de software CUDA eligió para documentar una aplicación correcta como una opción para los desarrolladores, en lugar de hacerlo parte de la biblioteca estándar de CUDA. De esta forma, los desarrolladores no están, sin saberlo, optando por un costo de rendimiento que no entienden.

Aparte: No creo que esta pregunta debe ser cerrado como "no constructiva". Creo que es una pregunta perfectamente válida, +1.

+1

Sí, pero técnicamente es una de las pocas personas que pueden responder la pregunta. Si bien dije por qué creo que tiene mucho sentido de esta manera, solo usted puede decir si es por eso que el equipo de CUDA lo eligió de esa manera. ;-) De todos modos, no fui yo quien rechazó la pregunta. – tera

+0

Hay muchas personas de NVIDIA que leen y responden preguntas de CUDA sobre SO (especialmente cuando nuestros foros de desarrolladores están caídos), y ese hecho hace que preguntas como esta sean válidas. Y podría haber publicado su comentario como respuesta, y hubiera sido correcto, y lo hubiese votado a favor. :) Por cierto, no asumí que votaste negativamente; Me refería a un voto para cerrar la pregunta. – harrism

+1

Acepto, esta es una pregunta perfectamente válida, los encabezados de CUDA podrían haber implementado doble átomo en el software. Aunque la forma en que se formuló desencadenó la luz roja para algunas personas, ¡creo que la decisión debería revertirse! – pszilard

Cuestiones relacionadas