2012-03-30 8 views
5

La memoria __shared__ en CUDA parece requerir un tamaño conocido en tiempo de compilación. Sin embargo, en mi problema, el tamaño de la memoria __shared__ sólo se conoce en tiempo de ejecución, es decir¿Cómo definir una memoria compartida CUDA con un tamaño conocido en tiempo de ejecución?

int size=get_size(); 
__shared__ mem[size]; 

Esto va a terminar con "Error: valor constante no se conoce", y no estoy seguro de cómo superar este problema

+0

posible duplicado de [asignación de memoria compartida] (http://stackoverflow.com/questions/5531247/allocating-shared-memory) – talonmies

Respuesta

5

El propósito de la memoria compartida es permitir que los hilos en un bloque colaboren. Cuando declara una matriz como __shared__, cada subproceso en el bloque ve la misma memoria, por lo que no tendría sentido que un subproceso determinado pudiera establecer su propio tamaño para una matriz en la memoria compartida.

Sin embargo, se admite el caso especial de especificar dinámicamente el tamaño de una única matriz __shared__ que tiene el mismo tamaño para todos los subprocesos. Ver allocating shared memory.

Si necesita asignar dinámicamente memoria para cada hilo, puede usar new o malloc dentro de un kernel (en Fermi), pero asignan memoria global, que es probable que sea lenta.

+0

En realidad, yo estaba tratando de hacer blockDim.x como el tamaño de la memoria __shared__, que será el mismo para todos los hilos en el mismo bloque, pero aún así falló (con un error diferente) –

+0

@HailiangZhang: Puede que no desee planear la solución de su problema variando dinámicamente las dimensiones del bloque. Normalmente, obtendrá el mejor rendimiento al considerar cuidadosamente el uso de recursos de su núcleo y establecer una dimensión de bloque óptima y fija en función de eso. Por ejemplo, usando la hoja de cálculo Calculadora de ocupación CUDA. Además, las dimensiones se deben multiplicar hasta un múltiplo del tamaño de la urdimbre para obtener el mejor rendimiento. Solo ajustaría dinámicamente las dimensiones de la cuadrícula para que se ajusten a sus datos. –

+0

@RogerDahl: Esta respuesta es incorrecta. Puedes __can__ determinar la memoria compartida del núcleo dinámicamente en tiempo de ejecución - esta ha sido una característica de CUDA desde 1.0. Ver [esta respuesta] (http://stackoverflow.com/a/5531640/681865) para saber cómo. – talonmies

Cuestiones relacionadas