2011-02-13 11 views
18

El tamaño de la memoria compartida ("memoria local" en términos de OpenCL) es de solo 16 KiB en la mayoría de las GPU nVIDIA actuales.
Tengo una aplicación en la que necesito crear una matriz que tiene 10.000 enteros. entonces la cantidad de memoria que necesitaré para encajar 10,000 enteros = 10,000 * 4b = 40kb.El tamaño de la memoria compartida de la GPU es muy pequeño. ¿Qué puedo hacer al respecto?

  • ¿Cómo puedo evitar esto?
  • ¿Hay alguna GPU que tenga más de 16 KiB de memoria compartida?

Respuesta

26

Piensa en la memoria compartida como caché administrada explícitamente. Tendrá que almacenar su matriz en la memoria global y almacenar en caché partes de la misma en la memoria compartida, según sea necesario, ya sea haciendo pases múltiples o algún otro esquema que minimice el número de cargas y almacene en/desde la memoria global.

La forma de implementar esto dependerá de su algoritmo; si puede dar algunos detalles de qué es exactamente lo que está tratando de implementar, puede obtener algunas sugerencias más concretas.

Un último punto - ser conscientes de que la memoria compartida es compartida entre todos los temas en un bloque - que tiene mucho menos de 16 kb por hilo, a menos que tenga una única estructura de datos que es común a todas las discusiones en un bloque .

+26

+1 A menudo es más fácil usar la memoria global y sólo cuenta con optimizaciones de rendimiento de memoria compartida después de que su código funciona. –

9

Todos los dispositivos con capacidades de cálculo 2.0 y superiores (la mayoría en el último año o dos) tienen 48 KB de memoria compartida disponible por multiprocesador. Dicho esto, la respuesta de Paul es correcta, ya que es probable que no desee cargar todos los enteros de 10K en un solo multiprocesador.

4

Puede intentar utilizar la función cudaFuncSetCacheConfig(nameOfKernel, cudaFuncCachePrefer{Shared, L1}).

Si prefiere L1 a Compartido, entonces 48 KB irán a L1 y 16 KB a Compartido. Si prefiere Compartido a L1, entonces 48 KB irán a Compartido y 16 KB irán a L1.

Uso:

cudaFuncSetCacheConfig(matrix_multiplication, cudaFuncCachePreferShared); 
matrix_multiplication<<<bla, bla>>>(bla, bla, bla); 
+0

Y el enlace para una explicación más detallada: http://developer.download.nvidia.com/compute/cuda/4_1/rel/toolkit/docs/online/group__CUDART__HIGHLEVEL_ge0969184de8a5c2d809aa8d7d2425484.html – BugShotGG

+0

@BugshotGG: El enlace está muerto, mejor enlace en algún lugar más estable ... – einpoklum

Cuestiones relacionadas