Estoy haciendo algunos puntos de referencia con CUDA, C++, C# y Java, y el uso de MATLAB para la verificación y la matriz de generación. Pero cuando me multiplicar con MATLAB, 2048x2048 y aún más grande matrices son casi instantáneamente multiplicado.

             1024x1024   2048x2048   4096x4096
             ---------   ---------   ---------
CUDA C (ms)      43.11      391.05     3407.99
C++ (ms)       6137.10    64369.29   551390.93
C# (ms)       10509.00   300684.00  2527250.00
Java (ms)      9149.90    92562.28   838357.94
MATLAB (ms)      75.01      423.10     3133.90

Sólo CUDA es competitivo, pero pensé que al menos C++ será algo cerca y no 60x más lento.

Así que mi pregunta es – ¿Cómo se MATLAB haciendo de él tan rápido?

Código C++:

float temp = 0;
timer.start();
for(int j = 0; j < rozmer; j++)
{
    for (int k = 0; k < rozmer; k++)
    {
        temp = 0;
        for (int m = 0; m < rozmer; m++)
        {
            temp = temp + matice1[j][m] * matice2[m][k];
        }
        matice3[j][k] = temp;
    }
}
timer.stop();

Editar:
Yo también no sé qué pensar sobre el C# resultados. El algoritmo es el mismo como C++ y Java, pero también hay un gigantesco salto 2048 de 1024?

Edit2:
Actualizado MATLAB y 4096x4096 resultados

  • Probablemente una cuestión de algoritmo que se utilice.
  • Asegúrese de Matlab no es la caché de resultado, que es complicado bestia. En primer lugar asegúrese de que el cálculo es en realidad que se realizan, y luego comparar.
  • LAPACK y vectorización. mathworks.com/company/newsletters/news_notes/clevescorner/…
  • Algoritmo clásico de la multiplicación de la matriz a través de 3 para los bucles, matlab resultados se ve bien, no exacta (pero muy cerca) cuando el uso de flotadores, pero yo creo que eso es debido a que el número de redondeo en idiomas.
  • tic y toc bruto del tiempo.
  • Y no te olvides de Matlab es, probablemente, haciendo doble precisión matemática donde la GPU (a menos que realmente nuevo) está haciendo de precisión simple.
  • Usted necesita tener cuidado sobre la fabricación de la feria de las comparaciones con C++. Puedes publicar el código de C++ que muestra el núcleo interior de los bucles de que usted está utilizando para la multiplicación de la matriz? En su mayoría, estoy preocupado con su diseño de memoria, y si estás haciendo las cosas derrochador. He escrito en C++ la multiplicación de la matriz que es tan rápida como la de Matlab, pero tomó un poco de cuidado. (EDIT: Antes de Matlab fue el uso de la Gpu para esto). Usted puede estar prácticamente seguro de que Matlab es perder muy pocos ciclos en estos «built-in» de funciones. Mi pregunta es, ¿dónde estás desperdiciando ciclos? (Sin ofender)
  • ¿Has comprobado que todas las implementaciones utilizan multi-threading optimizaciones para el algoritmo ? Y utilizan el mismo algoritmo de la multiplicación ? Realmente me cabe duda de que. Matlab no es inherentemente rápido, probablemente utilizado lento implementaciones. Algoritmos eficientes para la multiplicación de la matriz
  • ¿Qué acerca del uso de múltiples núcleos? Tu secuencial de bucle anidado no hacerlo.
  • Yo realmente creo que este post es muy interesante, pero realmente me gustaría ver más parámetros apropiados. Por ejemplo, creo que Matlab R2011a es el uso de múltiples hilos de forma automática y la matriz de multiplicaciones se implementan usando Intel mkl/blas de la biblioteca. Por lo tanto, me imagino que c++ es más rápido si uno utiliza un mkl llamado para hacer la multiplicación de la matriz. La pregunta sería entonces ¿qué Matlab de la sobrecarga. Sé que esto depende de los detalles adicionales de la multiplicación de la matriz, pero los números de arriba son bastante sentido ahora.
  • haciendo «temp += matice1[j][m] * matice2[m][k];» en su código de c++ le dará un poco de un borde; más aún-así como la matriz crece en tamaño.
  • Se podría cambiar el k-loop y la m-loop. Esto aumentará su código de C++, ya que utiliza cachés mejor. Consulte martin-thoma.com/matrix-multiplication-python-java-cpp
  • pregunta similar: Ingenuo de C++ de la Multiplicación de la Matriz 100 veces más lento que el de BLAS?
  • Lo de la CPU/GPU de los chipsets, los compiladores, y las versiones que se utilizaron para obtener estas métricas?
  • este código no es de caché amistoso, ya sea…
  • usted puede utilizar el «algoritmo de Strassen» de tiempo de ejecución O(n^2.81) para la ampliación de la plaza de la multiplicación de la matriz, que es alrededor de 10 veces más rápido que el nativo de la multiplicación que se ejecuta en O(n^3). también ESS/AVX puede ayudarle a obtener alrededor de 8-20x más rápido para la ejecución de código. todos juntos pueden tener una implementación en c más rápido que el de matlab uno.
  • Nunca he dado cuenta de cómo en los años 90 podría inv(rand(1000)) y devolver un resultado en cuestión de segundos. Que estaba en un 50 Mhz Intel 286 DX w/ matemáticas co-procesador.
  • el uso de MKL biblioteca de c++, a continuación, compare los resultados,

InformationsquelleAutor Wolf | 2011-05-19

12 Comentarios

  1. 82

    He aquí mis resultados usando MATLAB R2011a + Parallel Computing Toolbox en una máquina con un Tesla C2070:

    >> A = rand(1024); gA = gpuArray(A);
    % warm up by executing the operations a couple of times, and then:
    >> tic, C = A * A; toc
    Elapsed time is 0.075396 seconds.
    >> tic, gC = gA * gA; toc
    Elapsed time is 0.008621 seconds.

    MATLAB utiliza muy bibliotecas optimizadas para la multiplicación de la matriz que es la razón por la llanura de MATLAB la multiplicación de la matriz es tan rápido. El gpuArray versión utiliza MAGMA.

    Actualización mediante R2014a en una máquina con un Tesla K20c, y el nuevo timeit y gputimeit funciones:

    >> A = rand(1024); gA = gpuArray(A);
    >> timeit(@()A*A)
    ans =
        0.0324
    >> gputimeit(@()gA*gA)
    ans =
        0.0022

    Actualización mediante R2018b en un WIN64 máquina con 16 núcleos físicos y Tesla V100:

    >> timeit(@()A*A)
    ans =
        0.0229
    >> gputimeit(@()gA*gA)
    ans =
       4.8019e-04
  2. 160

    Este tipo de pregunta es recurrente y debe ser respondida con más claridad que «Matlab utiliza altamente optimizado bibliotecas» o «de Matlab se utiliza la MKL» por una vez en Stackoverflow.

    Historia:

    La multiplicación de la matriz (junto con la Matriz-vector, vector-vectores multiplicación y muchos de la matriz de descomposición) es (son) los problemas más importantes con álgebra lineal. Los ingenieros han logrado resolver estos problemas con los ordenadores desde los primeros días.

    Yo no soy un experto en la historia, pero al parecer en ese entonces, todo el mundo acaba de reescribió su Fortran versión con simples bucles. Algunos de normalización, a continuación, llegó, con la identificación de los «núcleos» (rutinas básicas) que la mayoría de los problemas de álgebra lineal necesarios para resolverlo. Estas operaciones básicas fueron estandarizados en una especificación llamada: Básicos de Álgebra Lineal Subprogramas (BLAS). Los ingenieros podrían, a continuación, llamar a estas estándar, bien probado BLAS rutinas en su código, hacer su trabajo mucho más fácil.

    BLAS:

    BLAS evolucionado desde el nivel 1 (la primera versión que se define escalar y vectorial de vectores-vector de operaciones) nivel 2 (vector-matriz de operaciones) para el nivel 3 (matriz-matriz de operaciones), y siempre más y más «núcleos» de manera estandarizada más y más fundamental de las operaciones de álgebra lineal. El original Fortran 77 implementaciones están todavía disponibles en El sitio web de la biblioteca de red.

    Hacia la mejora del desempeño:

    Lo largo de los años (en particular, entre el BLAS de nivel 1 y de nivel 2 versiones: a principios de los años 80), hardware ha cambiado, con el advenimiento de las operaciones vectoriales y jerarquías de la caché. Estas evoluciones hecho posible aumentar el rendimiento de la BLAS subrutinas sustancialmente. Diferentes proveedores, a continuación, llegó junto con su aplicación de BLAS rutinas que fueron más y más eficiente.

    No sé histórica de las implementaciones (yo no había nacido o un niño en aquel entonces), pero dos de los más notables salió en la década de 2000: el Intel MKL y GotoBLAS. Su Matlab utiliza el procesador Intel MKL, que es una muy buena, optimizado BLAS, y que explica el gran rendimiento que ver.

    Detalles técnicos sobre la multiplicación de la Matriz:

    Así que ¿por qué es Matlab (el MKL) de manera rápida en dgemm (doble precisión general de la multiplicación matriz-matriz)? En términos simples: porque utiliza vectorización y buen almacenamiento en caché de datos. En términos más complejos: ver la artículo proporcionada por Jonathan Moore.

    Básicamente, al realizar la multiplicación en el código de C++ siempre, no en todos los caches. Desde que tengo la sospecha de que creó una matriz de punteros a la fila de las matrices, sus accesos en el interior de bucle para la k-ésima columna de «matice2»: matice2[m][k] son muy lentos. De hecho, cuando el acceso matice2[0][k], usted debe obtener el k-ésimo elemento de la matriz 0 de la matriz. A continuación, en la siguiente iteración, se debe acceder a matice2[1][k], que es el k-ésimo elemento de la otra matriz (la matriz 1). A continuación, en la siguiente iteración acceso otra matriz, y así sucesivamente… Ya que toda la matriz matice2 no puede caber en el más alto cachés (es 8*1024*1024 bytes grandes), el programa debe buscar el elemento deseado desde la memoria principal, perder un montón de tiempo.

    Si sólo transpuesta de la matriz, por lo que los accesos sería en direcciones de memoria contiguas, el código ya se ejecutan mucho más rápido debido a que ahora el compilador puede cargar toda las filas de la caché al mismo tiempo. Acabo de probar esta versión modificada:

    timer.start();
    float temp = 0;
    //transpose matice2
    for (int p = 0; p < rozmer; p++)
    {
        for (int q = 0; q < rozmer; q++)
        {
            tempmat[p][q] = matice2[q][p];
        }
    }
    for(int j = 0; j < rozmer; j++)
    {
        for (int k = 0; k < rozmer; k++)
        {
            temp = 0;
            for (int m = 0; m < rozmer; m++)
            {
                temp = temp + matice1[j][m] * tempmat[k][m];
            }
            matice3[j][k] = temp;
        }
    }
    timer.stop();

    Así que usted puede ver como se acaba de caché de la localidad aumento de su código del rendimiento sustancialmente. Ahora el real dgemm implementaciones de aprovechar esto para un muy amplio nivel: realizar la multiplicación por bloques de la matriz definida por el tamaño del TLB (Translation lookaside buffer, cortocircuito largo de la historia: lo que efectivamente puede ser almacenado en caché), por lo que envían al procesador exactamente la cantidad de datos que puede procesar. El otro aspecto es que la vectorización, que utilizan el procesador de vectorizados instrucciones para la óptima instrucción de rendimiento, que realmente no se puede hacer a partir de su cruz-plataforma de código C++.

    Por último, la gente que dice que es porque de Strassen o Calderero–Winograd algoritmo son incorrectas, tanto estos algoritmos no son posibles de implementar en la práctica, debido a consideraciones de hardware mencionados anteriormente.

    • Acabo de ver un Scott Meyers video sobre la importancia de los tamaños de caché y los datos de adaptación en tamaños de línea de caché, y de los problemas que puede tener con subprocesos múltiples soluciones que no tienen los datos compartidos en la fuente, pero terminan con los datos compartidos en el hardware/core-nivel de subproceso : norton ghost.ser/WDIkqP4JbkE
  3. 39

    Esta es la razón por la. MATLAB no realizar un ingenuo multiplicación de la matriz con un bucle por cada elemento individual de la manera que usted hizo en su código de C++.

    Por supuesto, estoy asumiendo que usted acaba de utilizar C=A*B en lugar de escribir una multiplicación de la función de ti mismo.

  4. 19

    Matlab incorpora LAPACK hace algún tiempo, así que yo supongo que su multiplicación de la matriz utiliza algo al menos tan rápido. LAPACK código fuente y la documentación está disponible.

    También puede buscar en el Goto y Van De Geijn papel de «Anatomía de Alto Rendimiento de la Matriz
    Multiplicación» en http://citeseerx.ist.psu.edu/viewdoc/download?doi=10.1.1.140.1785&rep=rep1&tipo=pdf

  5. 9

    Cuando se realiza la matriz de multiplicar, utilice ingenuo método de multiplicación que se toma el tiempo de O(n^3).

    Existen multiplicación de la matriz algoritmo que toma O(n^2.4). Lo que significa que en n=2000 su algoritmo requiere ~100 veces más de la computación como el mejor algoritmo.

    Usted realmente debe comprobar la página de wikipedia para la multiplicación de la matriz para obtener más información sobre las formas eficaces para implementarlo.

    • y MATLAB probable que el uso de este algoritmo, ya que el tiempo para 1024*1024 multiplicar la matriz es menor que 8 veces el tiempo de 2048*2048 multiplicación de la matriz ! Bien hecho MATLAB chicos.
    • Dudo bastante que el uso «eficiente» de la multiplicación de los algoritmos, a pesar de sus ventajas teóricas. Incluso el algoritmo de Strassen tiene dificultades de aplicación, y el Calderero–Winograd algoritmo que usted probablemente ha leído acerca de, simplemente, no práctica (por ahora). También, relacionado con LO subproceso: stackoverflow.com/questions/17716565/…
    • Ese algoritmo es sólo para los muy grandes matrices.
  6. 9

    La respuesta es LAPACK y BLAS bibliotecas de hacer MATLAB cegadoramente rápido en operaciones de matriz, no cualquier código propietario por la gente en MATLAB.

    Utilizar el LAPACK y/o BLAS las bibliotecas en su código de C++ para operaciones de matriz y usted debe obtener un rendimiento similar como MATLAB. Estas bibliotecas deben estar disponibles libremente en cualquier sistema moderno y partes fueron desarrollados a lo largo de décadas en el mundo académico. Tenga en cuenta que existen múltiples implementaciones, incluyendo algunos de código cerrado como Intel MKL.

    Una discusión de cómo BLAS obtiene un alto rendimiento está disponible aquí.


    Por CIERTO, es un grave dolor en mi experiencia para llamar a LAPACK bibliotecas de c (pero vale la pena). Es necesario leer la documentación de forma MUY precisa.

  7. 6

    Dependiendo de la versión de Matlab, creo que puede ser el uso de la GPU ya.

    Otra cosa; Matlab realiza un seguimiento de muchas de las propiedades de su matriz; si su diagonal, hermetian, y así sucesivamente, y se especializa sus algoritmos basados en ellas. Tal vez sus especializada basada en el cero de la matriz que está pasando, o algo por el estilo? Tal vez es el almacenamiento en caché de repetidas llamadas a la función, que se mete a tus horarios? Tal vez se optimiza a cabo repetidas sin usar la matriz de productos?

    Para protegerse contra tales cosas sucediendo, el uso de una matriz de números aleatorios, y asegúrese de que la fuerza de la ejecución de imprimir el resultado en la pantalla o en el disco o somesuch.

    • Como una pesada ML de usuario, puedo decirles que no están usando GPGPU todavía. Nueva versión de matlab HACER uso SSE1/2 (por fin). Pero he hecho pruebas. Un MexFunction la realización de un elemento de sabios multiplicación se ejecuta dos veces tan rápido como A.*B hace. Por lo que el OP es casi seguro que perdiendo el tiempo en algo.
    • Matlab con Parallel Computing Toolbox puede el uso de un CUDA GPU, pero es explícita – usted tiene que insertar los datos en la GPU.
    • Yo uso M1 = single(rand(1024,1024)*255); M2 = single(rand(1024,1024)*255); y M3 = M1 * M2; …, a continuación, escribir a archivo binario de carrozas, todo se hace muy rápidamente.
  8. 3

    MATLAB utiliza una muy optimizado la aplicación de LAPACK de Intel conocido como Intel Math Kernel Library (Intel MKL) – específicamente la dgemm función. La velocidad de Esta biblioteca se aprovecha de las características de procesador, incluyendo instrucciones SIMD y procesadores multi-core. No documento que algoritmo específico que se utilice. Si usted fuera a llamar a Intel MKL de C++, usted debe ver a un rendimiento similar.

    No estoy seguro de lo de la biblioteca de MATLAB se utiliza para la GPU de la multiplicación, pero probablemente algo como nVidia CUBLAS.

    • Tienes razón, pero ¿has visto esta respuesta? Sin embargo, IPP no es MKL y MKL tiene muy superior en rendimiento de álgebra lineal en comparación con IPP. También, IPP obsoleto su matriz módulo de matemáticas en las últimas versiones.
    • Lo siento, no significaba MKL no IPP
    • Que están a la derecha de la otra respuesta que la cubre. Es tan detallado me lo perdí.
  9. 2

    La respuesta general a «¿por Qué es matlab más rápido en hacer xxx de otros programas de» es que matlab tiene un montón de construido en, funciones optimizadas.

    Los otros programas que se utilizan a menudo no tienen estas funciones para que la gente de aplicar sus propias soluciones creativas, que son sorprendentemente baratos más lento que profesionalmente código optimizado.

    Esto puede ser interpretado de dos maneras:

    1) El común/teórico manera: Matlab no es significativamente más rápido, se le acaba de hacer el benchmark mal

    2) La manera realista: Para estas cosas Matlab es más rápido en la práctica debido a lenguajes como c++ son demasiado fácilmente en un ineficaz maneras.

    • Él es la comparación de MATLAB velocidad con la velocidad de una función escribió en dos minutos. Soy capaz de escribir más rápido de la función en 10 minutos, o un mucho más rápido de la función en dos horas. El MATLAB chicos han pasado más de dos horas en hacer su matriz de multiplicación rápida.
  10. 2

    El contraste no es sólo debido a Matlab increíble de optimización (como se discutió por muchas otras respuestas ya), pero también en la forma en que se formuló la matriz como un objeto.

    Parece que hizo de la matriz de una lista de listas? Una lista de listas contiene punteros a las listas que a continuación contienen los elementos de la matriz. Las ubicaciones de los contenidos de las listas de asignados arbitrariamente. Como bucle de tu primer índice (número de fila?), el tiempo de acceso a memoria es muy importante. En comparación, ¿por qué no tratar de aplicar la matriz como una lista única/vector utilizando el siguiente método?

    #include <vector>
    
    struct matrix {
        matrix(int x, int y) : n_row(x), n_col(y), M(x * y) {}
        int n_row;
        int n_col;
        std::vector<double> M;
        double &operator()(int i, int j);
    };

    Y

    double &matrix::operator()(int i, int j) {
        return M[n_col * i + j];
    }

    El mismo algoritmo de la multiplicación debe ser utilizado de manera que el número de flop es el mismo. (n^3 para matrices cuadradas de tamaño n)

    Estoy pidiendo a la vez de manera que el resultado es comparable a lo que había antes (en la misma máquina). Con la comparación, que le mostrará exactamente cómo de memoria significativa el tiempo de acceso puede ser!

  11. 2

    Es lento en C++ ya que no está usando múltiples hilos. Esencialmente, si A = B C, donde están todas las matrices, la primera fila de Una puede ser calculado de forma independiente a partir de la 2ª fila, etc. Si a, B, y C son todos de n por n matrices, puede acelerar la velocidad de la multiplicación por un factor de n^2, como

    a_{i,j} = sum_{k} b_{i,k} c_{k,j}

    Si usted utiliza, dicen, Eigen [ http://eigen.tuxfamily.org/dox/GettingStarted.html ], multithreading es integrada y el número de hilos es ajustable.

  12. 2

    Porque MATLAB es un lenguaje de programación desarrolló en un principio para el álgebra lineal numérica (matriz de manipulaciones), que ha bibliotecas, especialmente desarrollado para la matriz de multiplicaciones. Y ahora MATLAB también puede utilizar el Las gpu (unidad de procesamiento de Gráficos) para este además.

    Y si nos fijamos en su cálculo de los resultados:

                 1024x1024   2048x2048   4096x4096
                 ---------   ---------   ---------
    CUDA C (ms)      43.11      391.05     3407.99
    C++ (ms)       6137.10    64369.29   551390.93
    C# (ms)       10509.00   300684.00  2527250.00
    Java (ms)      9149.90    92562.28   838357.94
    MATLAB (ms)      75.01      423.10     3133.90

    a continuación, podemos ver que no sólo MATLAB es tan rápido en la multiplicación de la matriz: CUDA C (lenguaje de programación de NVIDIA) tiene algunos de los mejores resultados de MATLAB. CUDA C también ha bibliotecas, especialmente desarrollado para la matriz de multiplicaciones y utiliza la Gpu.

    Breve historia de MATLAB

    Cleve Moler, el presidente del departamento de ciencias de computación en la Universidad de Nuevo México, inició el desarrollo de MATLAB en la década de 1970. Se diseñó para dar a sus estudiantes el acceso a LINPACK (una biblioteca de software para la realización de álgebra lineal numérica) y EISPACK (es una biblioteca de software para computación numérica de álgebra lineal) sin tener que aprender Fortran. Pronto se extendió a otras universidades y se encontró una fuerte audiencia en matemáticas aplicadas de la comunidad. Jack Poco, un ingeniero, fue expuesto a ella durante una visita Moler hizo a la Universidad de Stanford en el año 1983. El reconocimiento de su potencial comercial, se unió a Moler y Steve Bangert. Se reescribió MATLAB en C y fundó MathWorks en 1984 para continuar su desarrollo. Estos reescrito las bibliotecas eran conocidos como JACKPAC. En el año 2000, MATLAB fue reescrito para usar un conjunto más reciente de las bibliotecas para la manipulación de matrices, LAPACK (es un estándar de la biblioteca de software de álgebra lineal numérica).

    Fuente

    Lo que es CUDA C

    CUDA C utiliza también las bibliotecas, especialmente desarrollado para la matriz de multiplicaciones como OpenGL (Open Graphics Library). Se utiliza también la GPU y Direct3D (en MS Windows).

    La CUDA plataforma está diseñado para trabajar con lenguajes de programación como C, C++ y Fortran. Esta accesibilidad hace que sea más fácil para los especialistas en programación paralela para el uso de recursos de GPU, en contraste con la anterior Api como Direct3D y OpenGL, que requiere conocimientos avanzados en programación de gráficos. También, CUDA admite los marcos de programación tales como OpenACC y OpenCL.

    ¿Por qué es MATLAB tan rápido en la multiplicación de la matriz?

    Ejemplo de procesamiento CUDA de flujo:

    1. Copiar los datos desde la memoria principal a la memoria de la GPU
    2. De la CPU inicia la GPU kernel
    3. GPU núcleos CUDA ejecutar el kernel en paralelo
    4. Copia de los datos resultantes de la memoria de la GPU a la memoria principal

    La comparación de la CPU y la GPU, velocidad de Ejecución

    Nos quedamos un punto de referencia en el que se midió la cantidad de tiempo que tomó para ejecutar 50 pasos de tiempo para tamaños de cuadrícula de 64, 128, 512, 1024 y 2048 en un Procesador Intel Xeon X5650 y, a continuación, utilizando una NVIDIA Tesla C2050 GPU.

    ¿Por qué es MATLAB tan rápido en la multiplicación de la matriz?

    Para un tamaño de rejilla de 2048, el algoritmo se muestra un 7,5 x disminución en el tiempo de cálculo de más de un minuto en el CPU a menos de 10 segundos en la GPU. La escala del registro gráfico muestra que la CPU es más rápido para los pequeños tamaños de cuadrícula. A medida que la tecnología evoluciona y madura, sin embargo, GPU soluciones son cada vez más capaces de manejar problemas más pequeños, una tendencia que se espera continúe.

    Fuente

    De introducción para CUDA C Guía de Programación:

    Impulsado por la insaciable demanda de mercado en tiempo real, de alta definición de gráficos en 3D, el Gráfico programable Unidad de procesamiento de la GPU, se ha convertido en una altamente paralelo, multiproceso, manycore procesador con tremenda computacional caballos de fuerza y de muy alto ancho de banda de memoria, como se ilustra por Figure 1 y Figure 2.

    Figura 1. Las Operaciones de Punto flotante por Segundo para la CPU y la GPU

    ¿Por qué es MATLAB tan rápido en la multiplicación de la matriz?

    Figura 2. Ancho de Banda de memoria de la CPU y la GPU

    ¿Por qué es MATLAB tan rápido en la multiplicación de la matriz?

    La razón detrás de la discrepancia en punto flotante de capacidad entre la CPU y la GPU es que la GPU está especializado en computación intensiva, altamente computación paralela – exactamente lo de procesamiento de gráficos se acerca – y, por tanto, diseñado de tal forma que más transistores están dedicados al procesamiento de datos en lugar de almacenamiento en caché de datos y control de flujo, como se ilustra esquemáticamente por Figure 3.

    Figura 3. La GPU Dedica Más Transistores para Procesar los Datos

    ¿Por qué es MATLAB tan rápido en la multiplicación de la matriz?

    Más específicamente, la GPU es especialmente adecuada para abordar los problemas que pueden ser expresados como datos de cálculos paralelos – el mismo programa se ejecuta en muchos de los elementos de datos en paralelo con alta aritmética en la intensidad de la relación de las operaciones aritméticas a las operaciones de la memoria. Debido a que el mismo programa se ejecuta para cada elemento de datos, hay un menor requerimiento de sofisticados de control de flujo, y porque se ejecuta en muchos elementos de datos y tiene una alta intensidad aritmética, la memoria de la latencia de acceso se pueden ocultar con cálculos en lugar de grandes memorias caché de datos.

    De datos-procesamiento paralelo de los mapas de elementos de datos para el procesamiento en paralelo de los hilos. Muchas de las aplicaciones que procesar grandes conjuntos de datos puede utilizar una base de datos-programación paralela modelo para acelerar los cálculos. En la representación 3D, grandes conjuntos de píxeles y vértices se asignan a los hilos en paralelo. Del mismo modo, la imagen y los medios de procesamiento de aplicaciones, tales como post-procesamiento de las imágenes renderizadas, la codificación de vídeo y decodificación, la escala de la imagen, visión estéreo, y reconocimiento de patrones puede asignar los bloques de la imagen y los píxeles para el procesamiento en paralelo de los hilos. De hecho, muchos de los algoritmos de fuera del campo de la imagen de la representación y el procesamiento son acelerados por los datos-procesamiento en paralelo, desde el procesamiento de la señal o de la física de simulación computacional de las finanzas o de la biología computacional.

    Fuente

    Avanzadas de lectura


    Interesantes facs

    He escrito en C++ la multiplicación de la matriz que es tan rápida como la de Matlab, pero tomó un poco de cuidado. (Antes de Matlab fue el uso de la Gpu para esto).

    Cita de esta respuesta.

    • Que la última cotización no es «un hecho», es jactancia. Esa persona ha recibido varias solicitudes de código ya había publicado que. Pero ningún código en la vista.
    • Su descripción de cómo rápidamente usted puede hacer los cálculos en la GPU no se aborda la cuestión en absoluto. Todos sabemos que de 128 núcleos pequeños pueden hacer más de lo mismo, el trabajo monótono de 2 núcleos grandes. «Y ahora MATLAB también pueden usar la Gpu (unidad de procesamiento de Gráficos) para este además.» Sí, pero no por defecto. Normal de la multiplicación de la matriz todavía utiliza BLAS.
    • OK, no es un hecho! Tal vez usted tiene derecho sobre su «jactancia» – nosotros no lo saben y nosotros también no sé por qué él no responde. Para el segundo comentario: descripción de los cálculos en la GPU responde a la pregunta debido a que para la matriz de multiplicación en álgebra lineal se utiliza operaciones de punto flotante. Tal vez no es para todas las personas comprensible, pero creo que ellos tienen que entender lo basico. En otro caso tiene que aprender lo basico en primero antes de leer algún artículo acerca de las matrices. Y si alguien me escribirá sobre él, a continuación, voy a añadir esta información. Gracias!
    • Escribí la palabra "additionally". Significa: puede ser utilizado. También significa que los normales de la multiplicación de la matriz todavía utiliza bibliotecas de software. ¿Crees que tengo que cambiar mi post sea más comprensible? Gracias por sus comentarios!

Dejar respuesta

Please enter your comment!
Please enter your name here