Hur kommer det sig att BLAS är optimerat?

Permalänk
Skrivet av Erik_T:

BLAS är inte ett kodbibliotek. BLAS är en specifikation för ett kodbibliotek. Ett API om du föredrar den benämningen. Specifikationen definierar API:et för både Fortran och C.

Det finns många implementationer av BLAS. MKL innehåller en sådan implementation. Det finns många andra såsom ATLAS och OpenBLAS, eller Netlib BLAS som är referensimplementationen, skriven i FORTRAN 77 (och som inte är särskilt optimerad).

Kod som använder BLAS kan skrivas plattformsoberoende. Sedan när man bygger koden väljer man vilket BLAS bibliotek man länkar mot.

LAPACK i sin tur är ett kodbibliotek med rutiner för diverse operationer i linjär algebra. LAPACK använder sig av BLAS, så vill man att LAPACK rutiner skall köra snabbt så skall man använda en bra implementation av BLAS.
(Det finns några olika varianter av LAPACK också, men inte lika många som av BLAS eftersom det inte behövs lika ofta.)

Jag vet.
Trots att BLAS eller LAPACK som jag använder, verkar bara direkt översatt från FORTRAN 77 till ANSI C och K&R C, så kanske min MSVC kompilator optimera koden.

Permalänk
Medlem
Skrivet av heretic16:

Jag vet.
Trots att BLAS eller LAPACK som jag använder, verkar bara direkt översatt från FORTRAN 77 till ANSI C och K&R C, så kanske min MSVC kompilator optimera koden.

Det du använder ser ut att vara referensimplementationen av BLAS, maskinöversatt från FORTRAN 77 till C. Den koden härstammar från 70- och 80-talen. Koden ifråga bör vara både portabel och korrekt skriven, men det är en av de minst optimerade implementationerna av BLAS.
En bra kompilator hjälper naturligtvis, men den kan inte skriva om de använda algoritmerna och knappast göra ett bra jobb med att använda vektor-instruktioner om sådana finns.

Permalänk
Hedersmedlem
Skrivet av heretic16:

Men jag tror jag är dålig på att välja optimering.
https://i.ibb.co/Gsp3pBR/kate.png

Dessa kan du testa också:

Permalänk
Skrivet av Erik_T:

Det du använder ser ut att vara referensimplementationen av BLAS, maskinöversatt från FORTRAN 77 till C. Den koden härstammar från 70- och 80-talen. Koden ifråga bör vara både portabel och korrekt skriven, men det är en av de minst optimerade implementationerna av BLAS.
En bra kompilator hjälper naturligtvis, men den kan inte skriva om de använda algoritmerna och knappast göra ett bra jobb med att använda vektor-instruktioner om sådana finns.

Det är detta jag försöker åstadkomma.
Hur långt kommer man med att optimera C kod från 70 och 80 talet och ändå behålla portabiliteten.

Permalänk
Skrivet av Elgot:

Dessa kan du testa också:
<Uppladdad bildlänk>

Nej du. Detta blev segt. Tuggar fortfarande på...
Ändrar från O2 till Ox

- Enable Enchaced Instruction Set gjorde det sämre. Fick 360 sekunder istället för 250 sekunder.
- Ökad hastighet på floating point model gjorde så att programmet slutade aldrig slutföra sina beräkningar. Troligtvis fastnat i en loop
- När jag valde att optimera /GL hela programmet fick jag 341 sekunder.
- När jag hade Enable Instrinsic Functions till Yes så tog programmet 288 sekunder.

Nu har jag bara Ox och "neither" när optimeringen frågar om storlek eller hastighet. Då fick jag åter igen 288 sekunder.

Så bästa är Ox och Speed. Den ger runt 240 sekunder då för det jag ska göra.

Permalänk

Tror ni att om jag använder OpenBlas istället för Clapack, så kommer det vara en mer optimerad kod? Eller kommer jag få exakt samma resultat?
https://netlib.org/clapack/

Denna LAPACK-version använder jag. Uppdaterad sedan 2009.

Permalänk
Medlem
Skrivet av heretic16:

Tror ni att om jag använder OpenBlas istället för Clapack, så kommer det vara en mer optimerad kod? Eller kommer jag få exakt samma resultat?
https://netlib.org/clapack/

Denna LAPACK-version använder jag. Uppdaterad sedan 2009.

Du kommer antagligen att få högre prestanda från OpenBlas, men prova så får du se.

Permalänk
Skrivet av Erik_T:

Du kommer antagligen att få högre prestanda från OpenBlas, men prova så får du se.

När jag anropar mitt LAPACK så använder jag funktioner som slutar på _
Till exempelvis.

sgesdd_("S", &m, &n, Acopy, &lda, S, u, &ldu, V, &ldvt, &wkopt, &lwork, iwork, &info);

Nu när jag ser koden i OpenBlas, så är det helt andra namn, olika argument, andra datatyper osv. Så det kommer bli lika mycket jobb som att implementera OpenBlas, som jag implementerade CLapack.

Jag har som mål att kopiera över lapack-filer över till mitt projekt, där min kompilator bygger filerna. Då slipper jag länka.

Permalänk
Medlem
Skrivet av heretic16:

När jag anropar mitt LAPACK så använder jag funktioner som slutar på _
Till exempelvis.

sgesdd_("S", &m, &n, Acopy, &lda, S, u, &ldu, V, &ldvt, &wkopt, &lwork, iwork, &info);

Nu när jag ser koden i OpenBlas, så är det helt andra namn, olika argument, andra datatyper osv. Så det kommer bli lika mycket jobb som att implementera OpenBlas, som jag implementerade CLapack.

Jag har som mål att kopiera över lapack-filer över till mitt projekt, där min kompilator bygger filerna. Då slipper jag länka.

Det borde inte vara helt andra namn.

Men, det ser ut som om du har anropar Fortran interfacet till BLAS/LAPACK, inte C interfacet. Bägge borde finnas i OpenBLAS. Anropar du C-interfacet så heter funktionen cblas_sgesdd. Men, läs dokumentation istället för kod för att hitta hur den skall användas.

Permalänk
Skrivet av Erik_T:

Det borde inte vara helt andra namn.

Men, det ser ut som om du har anropar Fortran interfacet till BLAS/LAPACK, inte C interfacet. Bägge borde finnas i OpenBLAS. Anropar du C-interfacet så heter funktionen cblas_sgesdd. Men, läs dokumentation istället för kod för att hitta hur den skall användas.

Clapack är endast C kod. Inge fortran.
I clapack ingår det blas.

Men jag vet inte hur mycket jag vinner på att testa openblas. Mitt GNU Octave gjorde samma resultat som mitt c program.
Octave använder openblas.

Permalänk

Okej.

Jag behöver tydligen ett snabbare bibliotek än Clapack. Clapack må vara portabelt, men det är supersegt för matrismultiplikation. Alltså verkligen onödigt segt. Jag förstår varför, men jag vet inte hur OpenBlas har löst detta.

Så jag skulle behöva lite tips hur jag får till ett superoptimerat bibliotek för matrisalgebra.

Permalänk
Hedersmedlem
Skrivet av heretic16:

Okej.

Jag behöver tydligen ett snabbare bibliotek än Clapack. Clapack må vara portabelt, men det är supersegt för matrismultiplikation. Alltså verkligen onödigt segt. Jag förstår varför, men jag vet inte hur OpenBlas har löst detta.

Så jag skulle behöva lite tips hur jag får till ett superoptimerat bibliotek för matrisalgebra.

Det bästa är nog som sagt att använda MKL om det är tillgängligt, annars OpenBlas (om det finns) och i sista hand clapack. Många projekt använder ju till exempel CMake för att undersöka byggmiljön och anpassa bygget efter denna.

Permalänk
Skrivet av Elgot:

Det bästa är nog som sagt att använda MKL om det är tillgängligt, annars OpenBlas (om det finns) och i sista hand clapack. Många projekt använder ju till exempel CMake för att undersöka byggmiljön och anpassa bygget efter denna.

Nu har jag installerat MKL. Den hade tydligen stöd för integrering i visual studio community. Kul!

Permalänk
Hedersmedlem
Skrivet av heretic16:

Nu har jag installerat MKL. Den hade tydligen stöd för integrering i visual studio community. Kul!
Men hur använder jag den?
Behöver jag ens länka om MKL är integrerat i VS community?

Om du högerklickar på projektet och öppnar egenskaperna bör mkl ha en egen sektion.

MKL finns även via nuget (om man inte vill installera separat).

Permalänk
Skrivet av Elgot:

Om du högerklickar på projektet och öppnar egenskaperna bör mkl ha en egen sektion.

Det har den, men när jag ska köra

cblas_sgemm(CblasRowMajor, CblasNoTrans, CblasNoTrans, row_a, column_b, column_a, 1.0f, A, row_a, B, column_b, 0.0f, C, row_a);

Så får jag ett fel.

Unhandled exception at 0x00007FFDC58E4C3C (KernelBase.dll) in test.exe: 0xC06D007E: Module not found (parameters: 0x000000C52D13E710).

Permalänk
Hedersmedlem
Skrivet av heretic16:

Det har den, men när jag ska köra

cblas_sgemm(CblasRowMajor, CblasNoTrans, CblasNoTrans, row_a, column_b, column_a, 1.0f, A, row_a, B, column_b, 0.0f, C, row_a);

Så får jag ett fel.

Unhandled exception at 0x00007FFDC58E4C3C (KernelBase.dll) in test.exe: 0xC06D007E: Module not found (parameters: 0x000000C52D13E710).

Finns MKL-biblioteken i PATH?

Permalänk
Skrivet av Elgot:

Finns MKL-biblioteken i PATH?

Nej, det gjorde den inte. Ska lägga till den då. Vad är det man ska lägga till då?
Är det "C:\Program Files (x86)\Intel\oneAPI\mkl\latest\bin\intel64" ?

Permalänk
Hedersmedlem
Skrivet av heretic16:

Nej, det gjorde den inte. Ska lägga till den då. Vad är det man ska lägga till då?
Är det "C:\Program Files (x86)\Intel\oneAPI\mkl\latest\bin\intel64" ?

Den här tror jag är bra:
C:\Program Files (x86)\Intel\oneAPI\mkl\latest\redist\intel64

Permalänk
Skrivet av Elgot:

Den här tror jag är bra:
C:\Program Files (x86)\Intel\oneAPI\mkl\latest\redist\intel64

Det fungerade inte när jag lade till dessa i miljövariabler.

' test.exe' (Win32): Loaded 'C:\Users\ddd\GitHub\test\x64\Debug\ test.exe'. Symbols loaded. ' test.exe' (Win32): Loaded 'C:\Windows\System32\ntdll.dll'. ' test.exe' (Win32): Loaded 'C:\Windows\System32\kernel32.dll'. ' test.exe' (Win32): Loaded 'C:\Windows\System32\KernelBase.dll'. ' test.exe' (Win32): Loaded 'C:\Program Files (x86)\Intel\oneAPI\mkl\2023.2.0\redist\intel64\mkl_intel_thread.2.dll'. Module was built without symbols. ' test.exe' (Win32): Loaded 'C:\Windows\System32\vcruntime140d.dll'. ' test.exe' (Win32): Loaded 'C:\Windows\System32\ucrtbased.dll'. The thread 0x6884 has exited with code 0 (0x0). ' test.exe' (Win32): Loaded 'C:\Program Files (x86)\Intel\oneAPI\mkl\2023.2.0\redist\intel64\mkl_core.2.dll'. Module was built without symbols. ' test.exe' (Win32): Loaded 'C:\Program Files (x86)\Intel\oneAPI\mkl\2023.2.0\redist\intel64\libimalloc.dll'. Module was built without symbols. ' test.exe' (Win32): Unloaded 'C:\Program Files (x86)\Intel\oneAPI\mkl\2023.2.0\redist\intel64\libimalloc.dll' ' test.exe' (Win32): Loaded 'C:\Program Files (x86)\Intel\oneAPI\mkl\2023.2.0\redist\intel64\libimalloc.dll'. Module was built without symbols. ' test.exe' (Win32): Unloaded 'C:\Program Files (x86)\Intel\oneAPI\mkl\2023.2.0\redist\intel64\libimalloc.dll' ' test.exe' (Win32): Loaded 'C:\Program Files (x86)\Intel\oneAPI\mkl\2023.2.0\redist\intel64\mkl_avx512.2.dll'. Module was built without symbols. ' test.exe' (Win32): Loaded 'C:\Program Files (x86)\Intel\oneAPI\mkl\2023.2.0\redist\intel64\mkl_vml_avx512.2.dll'. Module was built without symbols. Exception thrown at 0x00007FFDC58E4C3C (KernelBase.dll) in test.exe: 0xC06D007E: Module not found (parameters: 0x0000001F61AFEA70). Unhandled exception at 0x00007FFDC58E4C3C (KernelBase.dll) in test.exe: 0xC06D007E: Module not found (parameters: 0x0000001F61AFEA70).

Permalänk
Hedersmedlem
Skrivet av heretic16:

Det fungerade inte när jag lade till dessa i miljövariabler.

' test.exe' (Win32): Loaded 'C:\Users\ddd\GitHub\test\x64\Debug\ test.exe'. Symbols loaded. ' test.exe' (Win32): Loaded 'C:\Windows\System32\ntdll.dll'. ' test.exe' (Win32): Loaded 'C:\Windows\System32\kernel32.dll'. ' test.exe' (Win32): Loaded 'C:\Windows\System32\KernelBase.dll'. ' test.exe' (Win32): Loaded 'C:\Program Files (x86)\Intel\oneAPI\mkl\2023.2.0\redist\intel64\mkl_intel_thread.2.dll'. Module was built without symbols. ' test.exe' (Win32): Loaded 'C:\Windows\System32\vcruntime140d.dll'. ' test.exe' (Win32): Loaded 'C:\Windows\System32\ucrtbased.dll'. The thread 0x6884 has exited with code 0 (0x0). ' test.exe' (Win32): Loaded 'C:\Program Files (x86)\Intel\oneAPI\mkl\2023.2.0\redist\intel64\mkl_core.2.dll'. Module was built without symbols. ' test.exe' (Win32): Loaded 'C:\Program Files (x86)\Intel\oneAPI\mkl\2023.2.0\redist\intel64\libimalloc.dll'. Module was built without symbols. ' test.exe' (Win32): Unloaded 'C:\Program Files (x86)\Intel\oneAPI\mkl\2023.2.0\redist\intel64\libimalloc.dll' ' test.exe' (Win32): Loaded 'C:\Program Files (x86)\Intel\oneAPI\mkl\2023.2.0\redist\intel64\libimalloc.dll'. Module was built without symbols. ' test.exe' (Win32): Unloaded 'C:\Program Files (x86)\Intel\oneAPI\mkl\2023.2.0\redist\intel64\libimalloc.dll' ' test.exe' (Win32): Loaded 'C:\Program Files (x86)\Intel\oneAPI\mkl\2023.2.0\redist\intel64\mkl_avx512.2.dll'. Module was built without symbols. ' test.exe' (Win32): Loaded 'C:\Program Files (x86)\Intel\oneAPI\mkl\2023.2.0\redist\intel64\mkl_vml_avx512.2.dll'. Module was built without symbols. Exception thrown at 0x00007FFDC58E4C3C (KernelBase.dll) in test.exe: 0xC06D007E: Module not found (parameters: 0x0000001F61AFEA70). Unhandled exception at 0x00007FFDC58E4C3C (KernelBase.dll) in test.exe: 0xC06D007E: Module not found (parameters: 0x0000001F61AFEA70).

Och du har startat om visual studio?

Permalänk
Skrivet av Elgot:

Och du har startat om visual studio?

Japp. Samma sak.

Permalänk
Hedersmedlem
Skrivet av heretic16:

Japp. Samma sak.

Och du bygger för x64?

Permalänk
Skrivet av Elgot:

Och du bygger för x64?

Ja, det gör jag.

Permalänk

Det fungerar att beräkna för dom övriga cblas rutiner.
Dock inte denna. Är det någon som ser vad jag gör för fel?

* C = alpha*A*B + beta*C * A [row_a*column_a] * B [column_a*column_b] * C [row_a*column_b] int m = row_a; int n = column_b; int k = column_a; float alpha = 1.0f; int lda = k; int ldb = n; float beta = 0.0f; int ldc = n; cblas_sgemm(CblasRowMajor, CblasNoTrans, CblasNoTrans, m, n, k, alpha, A, lda, B, ldb, beta, C, ldc);

Permalänk
Hedersmedlem
Skrivet av heretic16:

Det fungerar att beräkna för dom övriga cblas rutiner.
Dock inte denna. Är det någon som ser vad jag gör för fel?

* C = alpha*A*B + beta*C * A [row_a*column_a] * B [column_a*column_b] * C [row_a*column_b] int m = row_a; int n = column_b; int k = column_a; float alpha = 1.0f; int lda = k; int ldb = n; float beta = 0.0f; int ldc = n; cblas_sgemm(CblasRowMajor, CblasNoTrans, CblasNoTrans, m, n, k, alpha, A, lda, B, ldb, beta, C, ldc);

Fungerar koden i frågan här för dig?
https://stackoverflow.com/questions/38118003/multi-thread-mkl...

Permalänk
Skrivet av Elgot:

Den fungerar inte

Permalänk
Hedersmedlem
Skrivet av heretic16:

Den fungerar inte

Samma fel? Den fungerar för mig.

Permalänk
Skrivet av Elgot:

Samma fel? Den fungerar för mig.

Ja, samma fel.
Är är mer information om felet.

Filen mkl_intel_thread.2.dll finns.

Permalänk
Hedersmedlem
Skrivet av heretic16:

Ja, samma fel.
Är är mer information om felet.
https://i.ibb.co/tJ4Y1Yr/kate.png

Filen mkl_intel_thread.2.dll finns.

Kan man välja statisk länkning också?

Permalänk

Nu fungerar det. Ändrade från parallell till seq.

Jävlar! Vilka framsteg! Nu blev det snabbt!