Cuando ejecuto mi programa CUDA que se asigna sólo una pequeña cantidad de memoria global (por debajo de 20 M), tengo una «memoria» de error. (A partir de los mensajes de otras personas, creo que el problema está relacionado con la fragmentación de la memoria) trato de entender este problema, y doy cuenta de que tengo un par de preguntas relacionadas con CUDA gestión de la memoria.

  1. Hay un concepto de memoria virtual en CUDA?

  2. Si sólo uno de los kernel que se puede ejecutar en CUDA simultáneamente, después de su terminación, todos de la memoria que se utiliza o asignado liberado? Si no, cuando estas de memoria tienes libre liberado?

  3. Si hay más de un núcleo se pueden ejecutar en CUDA, ¿cómo pueden asegurarse de que la memoria que uso no se superponen?

Alguien me puede ayudar a responder estas preguntas? Gracias

Edit 1: sistema operativo: x86_64 GNU/Linux
CUDA versión: 4.0
Dispositivo: Geforce 200, es uno de los GPUS conectado a la máquina, y creo que no es un dispositivo de visualización.

Edit 2: lo siguiente es lo que tengo después de hacer algunas investigaciones. Siéntase libre de corregirme.

  1. CUDA va a crear un contexto para cada host hilo. En este contexto mantendrá la información, tales como qué parte de la memoria (pre asignados de memoria o la memoria asignada dinámicamente) ha sido reservado para esta aplicación, de forma que otra aplicación no se puede escribir en ella. Cuando esta aplicación termina (no del kernel) , esta parte de la memoria será liberado.

  2. CUDA memoria es mantenido por una lista de vínculos. Cuando una aplicación necesita asignar memoria, va a ir a través de este enlace de la lista para ver si hay es continua a trozos de memoria disponible para la asignación. En caso de no encontrar un fragmento, un «fuera de memoria de error de» se informe a los usuarios, incluso aunque el total de memoria disponible tamaño es mayor que la memoria solicitada. Y ese es el problema relacionado con la fragmentación de la memoria.

  3. cuMemGetInfo le dirá qué cantidad de memoria libre, pero no necesariamente la cantidad de memoria que se puede asignar en un máximo de asignación debido a la fragmentación de la memoria.

  4. De Vista de la plataforma (WDDM), memoria de la GPU de la virtualización es posible. Es decir, de múltiples aplicaciones, se puede asignar a casi la totalidad de la memoria de la GPU y WDDM se encargará de gestionar el intercambio de datos a la memoria principal.

Nuevas preguntas:
1. Si la memoria reservada en el contexto va a ser totalmente liberado después de la aplicación se ha terminado, la fragmentación de la memoria no debería de existir. Debe haber algún tipo de datos en la memoria.
2. Es allí cualquier manera de reestructurar la memoria de la GPU ?

  • Puede editar la pregunta para incluir el sistema operativo, cuda GPU y la versión que está usando, y si la GPU es una pantalla o no el dispositivo de visualización. Va a tener una influencia en la respuesta correcta a su pregunta.
  • Para responder a las preguntas adicionales del usuario observables de la fragmentación se produce dentro de un contexto, y no hay ninguna manera de cambiar la asignación de memoria en la GPU, que es manejado por el controlador de host.
  • Como te explique, en un contexto de asignación se compone de contexto asignación estática contexto de asignación de usuario y CUDA contexto montón en tiempo de ejecución. Creo que el tamaño de contexto asignación estática y el contexto del usuario asignación de pre-decidido. Por lo tanto, creo que la única causa de la fragmentación de la memoria está en el contexto de ejecución del montón que está sólo en la arquitectura Fermi. Es eso correcto? Supongo que el sistema de pre-asignar un bloque de memoria para el contexto montón en tiempo de ejecución, de modo que el núcleo dinámico de asignación de memoria es habilitar.
  • Tu pregunta es en la actualidad una especie de lío. puede editar solo han inicial de fondo, a continuación, un montón de preguntas?
InformationsquelleAutor xhe8 | 2011-12-30

2 Comentarios

  1. 25

    El dispositivo de memoria disponible en el código en tiempo de ejecución es, básicamente, calculado como

    Free memory =   total memory 
                  - display driver reservations 
                  - CUDA driver reservations
                  - CUDA context static allocations (local memory, constant memory, device code)
                  - CUDA context runtime heap (in kernel allocations, recursive call stack, printf buffer, only on Fermi and newer GPUs)
                  - CUDA context user allocations (global memory, textures)

    si usted está recibiendo un mensaje de memoria, entonces es probable que uno o más de los tres primeros elementos está consumiendo la mayor parte de la memoria de la GPU antes de su código de usuario siempre se intenta conseguir que la memoria en la GPU. Si, como usted ha indicado, no se ejecuta en una pantalla de la GPU, entonces el contexto de las asignaciones estáticas son la fuente más probable de su problema. CUDA obras de pre-asignación de toda la memoria de un contexto requiere en el momento en que el contexto se establece en el dispositivo. Hay un montón de cosas que obtener asignados para apoyar a un contexto, pero el mayor consumidor en un contexto local de la memoria. El tiempo de ejecución de debe de la reserva de la cantidad máxima de memoria que cualquier kernel en un contexto de consumir para el número máximo de subprocesos que cada multiprocesador pueden ejecutar simultáneamente, para cada multiproceso en el dispositivo. Esto puede llegar a cientos de Mb de memoria si la memoria local pesado kernel se carga en un dispositivo con una gran cantidad de multiprocesadores.

    La mejor manera de ver lo que podría estar pasando es escribir un programa de acogida con ningún dispositivo de código, que establece un contexto y llamadas cudaMemGetInfo. Que le mostrará la cantidad de memoria el dispositivo cuenta con la mínima contexto de sobrecarga en él. Luego de ejecutar código problemático, añadiendo el mismo cudaMemGetInfo llamada antes de la primera cudaMalloc llamada que le dará la cantidad de memoria que su contexto está utilizando. Que podría permitirle obtener un identificador de donde la memoria se va. Es muy poco probable que la fragmentación es el problema si usted está recibiendo el error en el primer cudaMalloc llamada.

    • talonmies, gracias por tu información. Es muy útil. Una pregunta más, ¿es posible que los múltiples contextos que existen en la memoria del dispositivo?
    • Sí es posible, pero un hilo dado sólo puede mantener siempre un único contexto en un dispositivo dado. El escenario sería de dos procesos tratando de ejecutar en el mismo GPU al mismo tiempo, o una aplicación multiproceso la apertura de dos contextos con dos hilos. El segundo es mucho más difícil de hacer en CUDA 4 de lo que solía ser.
    • Entonces, ¿qué mecanismo se utiliza para asignar memoria para múltiples contextos? ¿Cómo puede el sistema asegúrese de diferentes contextos se asignarán diferentes parte de la memoria?
    • La memoria asignada utilizando cudaMalloc pertenece a «CUDA contexto asignaciones estáticas», ¿correcto?
    • No, el Contexto de usuario de asignación de recursos. Asignaciones estáticas son aquellas cosas que se compilan en el contexto (local de memoria, la memoria constante, símbolos estáticos, código de dispositivo). Diferentes contextos son administrados por el CUDA de controlador de host (y WDDM en vista/win7). Cada CUDA contexto tiene su propio espacio de direcciones virtuales y el conductor mantiene la separación. De memoria y punteros no son portátiles entre los contextos (excepto cuando se usa el Fermi unificada para el espacio de direcciones del modelo). Usted tendrá que confiar en que la unidad funciona (y lo que no..)
    • Hola @talonmies. Tengo una pregunta acerca de la segmentación de la memoria: «constante, global, local de la memoria y tiempo de ejecución del montón son todas las partes de las 6 piezas de DRAM y no hay ninguna diferencia de la apariencia como la de Fermi documento muestra. Es el controlador de host que hace que ellos tienen distintas funciones», ¿es correcto? Gracias de antemano!

  2. 4
    1. GPU fuera del chip de memoria se divide en global, local y constante de la memoria. Estos tres tipos de memoria son un concepto de memoria virtual. La memoria Global es gratuito para todos los subprocesos, el local es sólo por un hilo (principalmente se utiliza para registrar derrame) y constante de la memoria se almacena en la caché global de la memoria (escritura sólo desde el código de host). Eche un vistazo a 5.3.2 desde el CUDA C Guía de Programación.

    2. EDICIÓN: eliminado

    3. Memoria asignada a través de cudaMalloc nunca se superponen. Para la memoria del kernel asigna durante el tiempo de ejecución debe ser suficiente memoria disponible. Si usted está fuera de la memoria y tratar de iniciar un núcleo (sólo una conjetura de mi parte) que usted debe obtener el «error desconocido» mensaje de error. El conductor que fue incapaz de iniciar y/o ejecuta el kernel.

    • Gracias por su respuesta. Pero creo que no quiero más bajo nivel de explicación. He aprendido de otros puestos que el CUDA gestión de la memoria tiene algo para lidiar con los contextos y las estructuras de datos, pero quiero más detener explicación, por lo que puedo averiguar el problema de memoria en mi programa.
    • La segunda respuesta es en su mayoría mal. Núcleo alcance de la memoria es pre asignados en el momento en que el contexto se establece en un dispositivo. El contenido de la memoria local son válidos sólo para la duración de la ejecución del Kernel, pero la propia memoria es reservada cuando el contexto está establecido. Dinámica de la memoria se asigna a partir de un montón en tiempo de ejecución, que también está reservada en el contexto de la creación del tiempo y que sigue siendo accesible y válido para la vida de el contexto, no el kernel. Hay una llamada a la API para manipular el tamaño de la pila en tiempo de ejecución desde el tamaño por defecto, si es necesario.
    • gracias por la corrección de mí

Dejar respuesta

Please enter your comment!
Please enter your name here