2011-08-30 15 views
13

Solo encontré una observación de que la memoria local es más lenta que la memoria de registro, los tipos de dos por subproceso.¿La memoria local es más lenta que la memoria compartida en CUDA?

Se supone que la memoria compartida es rápida, pero ¿es más rápida que la memoria local [del hilo]?

Lo que quiero hacer es una especie de filtro mediano, pero con un percentil dado en lugar de la mediana. Por lo tanto, necesito tomar partes de la lista, ordenarlas y luego elegir una adecuada. Pero no puedo comenzar a ordenar la lista de memoria compartida o las cosas salen mal. ¿Perderé mucho rendimiento simplemente copiando en la memoria local?

+0

Esto realmente no está relacionado con la programación, ¿o sí? Tampoco veo un fuerte vínculo con la etiqueta de Mathematica. –

+7

@Sjoerd C. de Vries: en el contexto de CUDA, es una pregunta relacionada con la programación: la arquitectura tiene un espacio de memoria no uniforme y el programador debe elegir explícitamente qué tipos de memoria y métodos de acceso se deben usar en cualquier código que él o ella escribe Es un principio básico de la programación de CUDA. – talonmies

+0

@talonmies Entiendo eso, pero aún así esta pregunta no se trata de seleccionar mediante programación la memoria, las diferencias entre las API, los registros de programación y la memoria compartida de programación, etc. Básicamente se trata de qué tipo de memoria es más rápida. Esa es una pregunta de hardware. Siento que el PO debería reformular la pregunta, por ejemplo en la dirección de su problema de encontrar un cierto percentil de los datos usando la memoria compartida en CUDA. –

Respuesta

23

La memoria local es solo la memoria global local de subprocesos. Es mucho, mucho más lento (tanto en términos de ancho de banda como de latencia) que los registros o la memoria compartida. También consume ancho de banda de controlador de memoria que de lo contrario estaría disponible para las transacciones de memoria global. El impacto en el rendimiento del derrame o el uso deliberado de la memoria local puede ser desde menor a mayor, dependiendo del hardware que esté utilizando y cómo se utiliza la memoria local.

De acuerdo con la investigación de Vasily Volkov - ver Better performance at lower occupancy (pdf) - no se trata de un factor de 8 diferencia en el ancho de banda efectivo entre la memoria compartida y esta registrado en Fermi GPU (alrededor de 1.000 Gb/s para la memoria compartida y 8000 Gb/s para registros). Esto contradice en cierto modo la documentación de CUDA, lo que implica que la memoria compartida es comparable en velocidad a los registros.

+0

Sí, gracias talonmies, para seguir elaborando con mis hallazgos experimentales que respaldan esta información: trabajar en la memoria local con mi problema era en realidad de un orden de magnitud más lento. Como mi programa ya funciona en los límites del tamaño de memoria compartida de mi hardware por bloque, no pude usar la memoria compartida para los recálculos, así que tuve que usar algunos algoritmos de memoria de registro no tan inteligentes para buscar mi percentil, esto resultó ser bastante rápido de todas formas. – JohnKay

Cuestiones relacionadas