GslAcml
(Boris Carlsson 2014-02-23)
gsl har blas-rutiner och cblas-rutiner. Alla funktioner som heter gsl_blas_* är bara interface till cblas_*-rutiner.
gsl:s cblas-rutiner är färdiga (men slöa) implementationer av blas. gsl:s cblas-rutiner ligger i biblioteket gslcblas (så du vill itne länka mot detta bibliotek).
acmlcblas är inte färdiga implementationer, utan bara interface till de underliggade blas-rutinerna (t ex dgemm_). Därför måste man även länka till antingen libacml (enkeltrådat bibliotek) eller libacml_mp (flertrådat).
Om du använder gsl, så ska du ha med output av
gsl-config --libs-without-cblas
när du länkar, samt
-lacmlcblas -lacml_mp
gsl-biblioteken och libacmlcblas ligger i
/c3se/apps/Glenn/gsl/1.15-gcc462/lib
och den katalogen inkluderas via gsl-config-outputen (givet att du använder den gsl-config som ligger i /c3se/apps/Glenn/gsl/1.15-gcc462/bin).
Jag såg också att du använder acml 5.1.0. I dokumentationen på c3se:s hemsida nämns endast 5.1.0, men den måste vara gammal, för även 5.2.0 och 5.3.0 finns, så jag skulle rekommendera 5.3.0, och då den med _mp-sufix för att få flertrådat:
module load acml/gfortran64_fma4_mp/5.3.0
När du har laddat en acml-modul och en gcc-modul (tips: gcc 4.8 finns på Glenn), kan du länka ett program som använder gsl/acml så här:
gcc $(gsl-config --libs-without-cblas) -lacmlcblas -lacml_mp main.o -o my_program
om du inte använder gsl:
gcc -L/c3se/apps/Glenn/gsl/1.15-gcc462/lib -lacmlcblas -lacml_mp main.o -o my_program
För att försäkra dig om att du inte råkat använda gsl:s implementering av blas-rutiner (via libgslcblas) kan du skriva:
ldd my_program
och så vill du inte ha en rad i stil med:
libgslcblas.so.0 => /c3se/apps/Glenn/gsl/1.15-gcc462/lib/libgslcblas.so.0 (0x00007fa924500000)
För att försäkra sig om att acml:s blas-implementering används, kan du skriva (givet att du gör matris-matris-multiplikation någonstans, annars kan du ersätta dgemm_ med en annan blas-rutin du använder):
LD_DEBUG=bindings ./my_program 2>&1 | grep dgemm_
som, om allt är rätt, skriver ut något i stil med:
22674: binding file ./my_program [0] to /c3se/apps/Common/acml/5.3.0/gfortran64_fma4_mp/lib/libacml_mp.so [0]: normal symbol `dgemm_'
där det viktiga är att det är libacml_mp.so. Om du råkat länka mot libgslcblas, så skulle
LD_DEBUG=bindings ./my_program 2>&1 | grep cblas_dgemm
ge något i stil med
22797: binding file ./a.out [0] to /c3se/apps/Glenn/gsl/1.15-gcc462/lib/libgslcblas.so.0 [0]: normal symbol `cblas_dgemm'
Aktivera många varningar när du kompilerar för att upptäcka eventuella icke-initialiserade variabler eller liknande fel som bara gör sig till känna ibland. Även valgrind kan vara bra att använda för att upptäcka felaktig kod. Exempel på kompileringsflaggor att använda till gfortran (som jag ofta använder): -O2 -Wall -W -Wextra -Wno-unused-parameter -Wno-unused-dummy-argument -Wconversion -Wshadow -Wno-maybe-uninitialized kan vara bra ibland.