programming geforce performance cuda gpgpu

performance - geforce - nvidia cuda driver



¿Por qué el código CUDA se ejecuta mucho más rápido en NVIDIA Visual Profiler? (3)

Un fragmento de código que lleva más de 1 minuto en la línea de comandos se realizó en cuestión de segundos en NVIDIA Visual Profiler (ejecutando el mismo archivo .exe). Entonces la pregunta natural es ¿por qué? ¿Hay algún problema con la línea de comandos o Visual Profiler hace algo diferente y realmente no ejecuta todo como en la línea de comandos?

Estoy usando CUBLAS, Thrust y cuRAND.

Incidentalmente, recientemente se ha producido una notable desaceleración en el código compilado en mi máquina, incluso en el código antiguo que antes se ejecutaba rápidamente, por lo que sospecho

Actualizar:

  • He comprobado que la salida calculada en la línea de comandos y Visual Profiler es idéntica , es decir, se ha ejecutado todo el código requerido en ambos casos.
  • GPU-shark indicó que mi estado de rendimiento no había cambiado en P0 cuando cambié de la línea de comandos a Visual Profiler.
  • Sin embargo, el uso de GPU se reportó al 0.0% cuando se ejecuta con Visual Profiler , pero fue tan alto como 98% cuando se ejecuta fuera de la línea de comandos .
  • Además, se usa mucho menos memoria con Visual Profiler . Cuando se ejecuta fuera de la línea de comandos, el administrador de tareas indica el uso de 650-700MB de memoria (picos en la primera cudaFree(0) ). En Visual Profiler esa cifra se reduce a ~ 100MB.

Esta es una pregunta antigua, pero acabo de terminar de perseguir el mismo problema (aunque la causa puede no ser la misma).

A saber: mi aplicación alcanzó entre 900 y 1100 cuadros (lanzamientos síncronos) por segundo cuando se ejecuta bajo NVVP, pero alrededor de 100-120 cuando se ejecuta fuera del generador de perfiles.

La causa parece ser un mensaje de estado que estaba imprimiendo en la consola a través de cout . Tenía la intención de que esto solo sucediera una vez cada 100-200 fotogramas. En su lugar, estaba imprimiendo el mensaje de estado para cada fotograma, y ​​la E / S de la consola se convirtió en el cuello de botella.

Al solo imprimir el mensaje de estado cada 100 cuadros (aunque el número óptimo aquí dependería de su aplicación), la velocidad de cuadros saltó nuevamente para coincidir con lo que estaba viendo en NVVP. Por supuesto, esto también podría manejarse en un subproceso de CPU separado si ese tipo de sobrecarga es inaceptable en sus circunstancias.

NVVP tiene que redireccionar stdout a su propio búfer interno para capturar el resultado de la aplicación (que se muestra en la pestaña de la consola). Parece que el mecanismo de NVVP para almacenar en búfer o procesar esa salida tiene una sobrecarga significativamente menor que permitir que el sistema operativo lo maneje directamente. Parece que NVVP almacena en búfer todo y lo muestra en un subproceso separado, o simplemente guarda un montón de resultados hasta que se alcanza algún umbral, cuando agrega ese búfer a su propia pestaña de consola.

Por lo tanto, mi consejo sería deshabilitar cualquier E / S de consola y ver si eso afecta las cosas o cómo.

(No ayudó que VS2012 se negara a configurar mi aplicación CUDA. Habría sido bueno ver que el 80% del tiempo de ejecución se gastó en la consola IO).

¡Espero que esto ayude!


Esto no debería suceder. Nunca he visto nada igual; Probablemente algo en su configuración.