Por favor alguien puede ayudarme con un ejemplo muy sencillo sobre cómo usar memoria compartida? El ejemplo incluido en el Cuda C guía de programación parece lleno de detalles irrelevantes.

Por ejemplo, si copia una gran variedad para el dispositivo de memoria global y quiere cuadrado de cada elemento, ¿cómo puede la memoria compartida se utiliza para acelerar este proceso? O no es útil en este caso?

InformationsquelleAutor Tudor | 2011-11-04

2 Comentarios

  1. 29

    En el caso concreto que mencionas, la memoria compartida no es útil, por la siguiente razón: cada elemento de datos sólo se utiliza una vez. Para la memoria compartida para ser útil, debe utilizar los datos transferidos a la memoria compartida varias veces con patrones de acceso, para que la ayuda. La razón de esto es simple: sólo la lectura de la memoria global requiere 1 global de la memoria de lectura y cero de memoria compartida lee; lectura en memoria compartida primera requeriría 1 global de la memoria de lectura y 1 compartido de la memoria de lectura, que lleva más tiempo.

    He aquí un ejemplo simple, donde cada hilo en el bloque calcula el valor correspondiente, al cuadrado, más el promedio de sus dos a la izquierda y a la derecha los vecinos, cuadrado:

      __global__ void compute_it(float *data)
      {
         int tid = threadIdx.x;
         __shared__ float myblock[1024];
         float tmp;
    
         //load the thread's data element into shared memory
         myblock[tid] = data[tid];
    
         //ensure that all threads have loaded their values into
         //shared memory; otherwise, one thread might be computing
         //on unitialized data.
         __syncthreads();
    
         //compute the average of this thread's left and right neighbors
         tmp = (myblock[tid > 0 ? tid - 1 : 1023] + myblock[tid < 1023 ? tid + 1 : 0]) * 0.5f;
         //square the previousr result and add my value, squared
         tmp = tmp*tmp + myblock[tid] * myblock[tid];
    
         //write the result back to global memory
         data[tid] = myblock[tid];
      }

    Tenga en cuenta que este está previsto para el trabajo utilizando un solo bloque. La extensión a más bloques debe ser sencillo. Se supone bloque dimensión (1024, 1, 1) y la rejilla de dimensión (1, 1, 1).

    • no te pierdas una sincronización de la barrera antes de iniciar el cómputo de los vecinos de datos en memoria compartida ?
    • sí, tienes razón, por supuesto. La edición de ahora.
    • Buen ejemplo de ello. Gracias!
    • Mi imagen favorita para usar a la hora de explicar la memoria compartida es un Fórmula 1 parada en boxes. http://www.youtube.com/watch?v=UUvagsM176o La operación se realiza en un cierto entorno restringido que permite a un grupo de gente para trabajar en paralelo en el mismo coche, permitiendo que la tarea se hace mucho más rápido.
    • Gracias por este muy útil ejemplo, hay un extra entre paréntesis al final de la primera línea de tmp, así que he editado.
  2. 10

    Pensar de memoria compartida como un administrar explícitamente caché – sólo es útil si usted necesita para acceder a los datos más de una vez, ya sea dentro del mismo hilo o de hilos diferentes dentro de la misma bloque. Si sólo se está accediendo a los datos una vez, a continuación, la memoria compartida no va a ayudar a usted.

    • Así, por ejemplo, en la matriz de cuadratura problema, no sería de ayuda, pero si me caché digamos a y B en Una multiplicación de la matriz funciona porque son reutilizados varias veces?
    • exactamente todo lo que beneficiaría a decir caché L1 en un convencionales aplicación potencialmente podrían beneficiarse del uso de la memoria compartida en un CUDA de la aplicación – por lo que si estás leyendo un valor, ajustarlo y, a continuación, escribir, entonces no hay ningún beneficio en cualquiera de los casos.
    • Bonita explicación!!!

Dejar respuesta

Please enter your comment!
Please enter your name here