gpu - aumentar - memoria compartida del sistema
El tamaño de la memoria compartida de la GPU es muy pequeño. ¿Qué puedo hacer al respecto? (3)
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 tenga 10,000 enteros. así que la cantidad de memoria que necesitaré para caber 10,000 enteros = 10,000 * 4b = 40kb.
- ¿Cómo puedo solucionar esto?
- ¿Hay alguna GPU que tenga más de 16 KiB de memoria compartida?
Piense en la memoria compartida como un caché gestionado explícitamente. Deberá almacenar su matriz en la memoria global y almacenar en caché partes de ella en la memoria compartida según sea necesario, ya sea realizando varias pasadas o algún otro esquema que minimice el número de cargas y almacene desde / hacia la memoria global.
La forma en que implementes esto dependerá de tu algoritmo: si puedes dar algunos detalles de qué es exactamente lo que estás tratando de implementar, puedes obtener algunas sugerencias más concretas.
Un último punto: tenga en cuenta que la memoria compartida se comparte entre todos los subprocesos de un bloque: tiene mucho menos de 16 kb por subproceso, a menos que tenga una estructura de datos única que sea común a todos los subprocesos de un bloque.
Toda la capacidad de cómputo 2.0 y dispositivos mayores (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 10 K en un solo multiprocesador.
Puede intentar usar la función cudaFuncSetCacheConfig(nameOfKernel, cudaFuncCachePrefer{Shared, L1})
.
Si prefiere L1 a Compartido, entonces 48KB irán a L1 y 16KB irán a Compartido. Si prefiere Compartido a L1, 48KB irán a Compartido y 16KB irán a L1.
Uso:
cudaFuncSetCacheConfig(matrix_multiplication, cudaFuncCachePreferShared);
matrix_multiplication<<<bla, bla>>>(bla, bla, bla);