¿Cuál es la función más triviales que se beneficiaría de ser computada en una GPU?

StackOverflow https://stackoverflow.com/questions/2443402

  •  19-09-2019
  •  | 
  •  

Pregunta

Me estoy empezando a cabo el aprendizaje de OpenCL. Estoy tratando de tener una idea de lo que las ganancias de rendimiento que esperan cuando se mueve funciones / algoritmos para la GPU.

El núcleo más básica ofrecida en la mayoría de los tutoriales es un núcleo que tiene dos conjuntos de números y suma el valor en los índices correspondientes y los añade a una tercera serie, así:

__kernel void 
add(__global float *a,
    __global float *b,
    __global float *answer)
{
    int gid = get_global_id(0);
    answer[gid] = a[gid] + b[gid];
}

__kernel void
sub(__global float* n,
    __global float* answer)
{
    int gid = get_global_id(0);
    answer[gid] = n[gid] - 2;
}

__kernel void
ranksort(__global const float *a,
         __global float *answer)
{
  int gid = get_global_id(0);
  int gSize = get_global_size(0);
  int x = 0;
  for(int i = 0; i < gSize; i++){
    if(a[gid] > a[i]) x++;
  }
  answer[x] = a[gid];
}

Estoy asumiendo que nunca podría justificar el cálculo de este en la GPU, la transferencia de la memoria podría salir peso del tiempo que tomaría el cálculo de este en el CPU por magnitudes (puedo estar equivocado acerca de esto, por lo tanto, esta cuestión).

Lo que me pregunto es ¿cuál sería el ejemplo más trivial donde se espera aumento de velocidad significativo cuando se utiliza un kernel OpenCL en lugar de la CPU?

¿Fue útil?

Solución

si tiene una suficientemente grande conjunto de matrices tiene la intención de realizar operaciones de álgebra lineal en, o que está esencialmente realizar la misma operación en cada elemento, i consideraría que como un ejemplo trivial. la multiplicación de matrices, además, de la FFT, convolución, etc. verá un poco de un aumento de velocidad sin hacer mucho trabajo. Ahora bien, si quieres ver las aceleraciones 100x entonces es necesario profundizar en la gestión de memoria y saber un poco clara acerca de lo que está pasando detrás de las escenas.

para empezar, yo recomendaría empezar con pycuda ya que es bastante simple para empezar, ya que proporciona un alto nivel de abstracción y le permitirá saltar muy rápidamente. echa un vistazo a este curso sobre el uso de la computación paralela CUDA de la Universidad de Illinois http: //courses.ece. illinois.edu/ece498/al/ cuando esté listo para sumergirse en el más allá.

Otros consejos

depende de la definición de trivial. en mi opinión, sería producto de matriz de la matriz, ya que tiene O(3)/O(2) calcular al cociente de la memoria. Algoritmos que exhiben relaciones similares, son susceptibles de beneficiarse de ser competido en GPU.

Mientras que su núcleo es claramente muy trivial que puede ser un ejemplo útil, es completamente ruedas desde la memoria para cada elemento tiene dos lecturas y uno de escritura, y sólo una operación aritmética. Hay algunas instrucciones para calcular la dirección, etc., pero todo esto equivale a prácticamente nada en comparación con el costo de acceder a la memoria.

Si se asume que los datos están ya en la GPU, puede beneficiarse de muy alto ancho de banda de la GPU a la memoria incluso para este sencillo kernel.

Por supuesto, las GPU dependen de usted tener suficientes hebras para ocultar la latencia de la memoria, por lo que el tamaño de su grupo de trabajo local debe ser bastante grande (digamos 256 o 512) y el tamaño de su grupo de trabajo global deben ser muy grandes (por ejemplo, cientos de miles ) para que esto sea efectivo, pero eso es una especie de punto!

Sé que la pregunta es bastante viejo, pero ... He encontrado que los cálculos del conjunto de Mandelbrot es bastante óptimo para la GPU. Usted tiene un vector complejo de entrada (float2) y una salida escalar (int) y que tendrá un centenar de operaciones por vector de entrada en promedio.

Podría ser utilizado como un buen ejemplo de aplicación, ya que ...

  • tiene un conjunto de datos de entrada de 2 dimensiones (calcula una imagen)
  • se puede explicar por qué los frentes de onda y 2 procesamiento dimensional es beneficioso en algunos casos
  • demuestra tipos de datos vectoriales
  • produce una imagen, que es rápidamente verificable por los ojos humanos (depuración)
  • se puede extender fácilmente a través de: la asignación de colores (__constant), el procesamiento float4 en lugar de float2 (optimización), produciendo int4 vectores de salida (R, G, B, A) (optimización). etapas de reducción (RGBA) => (RGB)
  • conocimiento de matemáticas necesita es aceptable (fórmula sencilla)

Saludos, Stefan

Después de la multiplicación de matrices que diría imagen de convolución (como desenfoque, eliminación de ruido, etc). Echa un vistazo a de AMD tutorial .

¿Qué es "más trivial" es una cuestión de opinión, pero yo diría que el cálculo de una imagen del conjunto de Mandelbrot es una aplicación bastante sencilla usando la GPU. Cada punto es totalmente independiente de cualquier otro punto, por lo que puede poner en marcha un hilo para cada punto y obtener tremenda aceleración. La fórmula en sí que se itera es una función cuadrática simple. Lo utilicé como ejemplo en un tutorial que se puede encontrar en mi blog aquí , simplemente calculando los números sin siquiera hacer una imagen para que sea aún más sencillo. Casi cualquier vergonzosamente paralelas (véase la entrada de Wikipedia) problema es una buena para empezar.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top