5

Actualmente tengo un ciclo For paralelo similar a esto:manera más fácil de utilizar la GPU para el ciclo For paralelo

int testValues[16]={5,2,2,10,4,4,2,100,5,2,4,3,29,4,1,52}; 
parallel_for (1, 100, 1, [&](int i){ 
    int var4; 
    int values[16]={-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1}; 
    /* ...nested for loops */ 
     for (var4=0; var4<16; var4++) { 
      if (values[var4] != testValues[var4]) break; 
     } 
    /* ...end nested loops */ 
} 

He optimizado tanto como pueda hasta el punto que la única cosa más que puedo hacer es agregar más recursos.

Estoy interesado en utilizar la GPU para ayudar a procesar la tarea en paralelo. He leído que tareas paralelas embarazosas como esta pueden hacer uso de una GPU moderna con bastante eficacia.

Usando cualquier idioma, ¿cuál es la forma más fácil de usar la GPU para un bucle paralelo simple como este?

No sé nada sobre las arquitecturas GPU o el código nativo de la GPU.

+0

Si su tarea es una tarea de computación numérica de algún tipo, o si puede volver a convertirla en un problema matemático basado en la matriz, entonces podría usar MATLAB. Los nuevos MATLAB son compatibles tanto con parallel-for ('parfor' de Parallel Computing Toolbox) como con Matriz Matriz en Nvidia CUDA GPUs. Ambas son relativamente indoloras, requiriendo solo cambios modestos al código MATLAB existente. –

+0

Puede ser útil obtener más información sobre lo que intenta hacer aquí.Recuerde que la transferencia de datos desde la CPU a la GPU genera una sobrecarga significativa, por lo que el cálculo de la GPU solo aumenta el rendimiento si realiza un gran trabajo computacional por unidad de datos de entrada. Calcular el cuadrado de cada número en un vector no es un buen uso de GPGPU (casi ningún trabajo por unidad de datos); El cálculo de la FFT de un vector es un buen uso (mucho trabajo con pocos datos). –

+0

Tengo varios bucles for anidados, en el ciclo más interno estoy usando los índices de bucle para calcular 16 valores y compararlos con la matriz testValues ​​[]. No debería haber ningún acceso significativo a la memoria. También estoy usando una tarjeta AMD/ATI (6850). – Flash

Respuesta

2

como dijo Li-aung Yip en comentarios, la forma más simple de usar una GPU es con algo como Matlab que admite operaciones de matriz y automáticamente (más o menos) mueve esas a la GPU. pero para que eso funcione, debe volver a escribir su código como operaciones basadas puramente en matriz.

de lo contrario, la mayoría del uso de GPU aún requiere codificación en CUDA o OpenCL (necesitaría usar OpenCL con una tarjeta AMD). incluso si utiliza un contenedor para su idioma favorito, el código real que se ejecuta en la GPU todavía se escribe generalmente en OpenCL (que se parece vagamente a C). y entonces esto requiere una buena cantidad de aprendizaje/esfuerzo. puede comenzar descargando OpenCL de AMD y leyendo los documentos ...

ambas opciones requieren aprender nuevas ideas, sospecho. lo que realmente quieres, creo, es un lenguaje de alto nivel, pero aún de aspecto tradicional, dirigido a la GPU. desafortunadamente, no parecen existir mucho, todavía. el único ejemplo en el que puedo pensar es theano - puede intentarlo. incluso allí, todavía necesitas aprender python/numpy, y no estoy seguro de cuán sólida es la implementación de theano, pero puede ser la forma menos dolorosa de avanzar (dado que permite un enfoque "tradicional", el uso de matrices es de muchas maneras). más fácil, pero algunas personas parecen encontrarlo muy difícil de entender, conceptualmente).

ps no es claro para mí que un gpu ayudará a su problema, por cierto.

+0

Decidí usar OpenCL - la curva de aprendizaje no es tan mala en realidad. Me resultó más fácil que luchar con las bibliotecas que intentan convertir el código existente: las pocas envolturas que pude encontrar fallaron bastante rápido y de todos modos requerían técnicas de programación de GPU. Parece que Matlab solo apoya a CUDA por el momento, desafortunadamente. – Flash

+0

bien, genial. ¿Estás llamando desde c? Descubrí que el pyopencl era más fácil que c: todavía programa la parte opencl de la misma manera, pero hay menos trabajo en la preparación de los datos para enviar. pero entonces estoy más acostumbrado a Python que c ... –

0

Es posible que desee consultar OpenACC que permite el paralelismo a través de directivas. Puede transferir sus códigos (C/C++/Fortran) a sistemas heterogéneos mientras mantiene un código fuente que todavía funciona bien en un sistema homogéneo. Eche un vistazo a esta introducción video. OpenACC no es programación GPU, sino que expresa paralelismo en su código, que puede ser útil para lograr mejoras de rendimiento sin demasiado conocimiento en lenguajes de bajo nivel como CUDA o OpenCL. OpenACC está disponible en compiladores comerciales de PGI, Cray y CAPS (PGI ofrece a los nuevos usuarios una prueba gratuita de 30 días).

Cuestiones relacionadas