У меня есть код C ++, который использует собственные расчеты линейной алгебры. Код работает на кластере, где есть модуль с Intel MKL. Я совершенно не знаю о том, как это сделать, но я хотел попытаться связать MKL, чтобы использовать реализации Lapack, чтобы увидеть, смогу ли я получить ускорение. < /P>
То, что я сделал (большинство вещей, которые я должен признать под предложением чат -бота), является < /p>
Добавить в Bash.rc эти две линии: < /p>
module load intel-oneapi-mkl/2023.2.0-oneapi-2023.2.0-5k4deyq
export MKLROOT=/opt/spack/opt/spack/linux-rocky8-icelake/oneapi-2023.2.0/intel-oneapi-mkl-2023.2.0-5k4deyq453rywyrtygtmy43k726orka5
< /code>
Скомпилируется со следующим Makefile < /p>
CXX := g++
CXX2 := mpicxx
CXXFLAGS := -std=c++20 -O3 -DNDEBUG -march=native -ffast-math -Wall \
-DEIGEN_USE_MKL_ALL \
-I ../../LIBRARIES/eigen-3.4.0/Eigen -I ../../LIBRARIES/eigen-3.4.0 \
-I${MKLROOT}/include
src_file := main.cpp walker.cpp random.cpp
obj_file := $(patsubst %.cpp, %.o, $(src_file))
VPATH := ./SOURCE/
OBJPATH := ./OBJECTS/
source := $(patsubst %.cpp, $(VPATH)%.cpp, $(src_file))
objects := $(patsubst %.o, $(OBJPATH)%.o, $(obj_file))
EXECUTABLE := main.out
# Linker flags to use MKL libraries (MKLROOT assumed set externally)
LDFLAGS := -Wl,--no-as-needed \
-L${MKLROOT}/lib/intel64 \
-Wl,-rpath,${MKLROOT}/lib/intel64 \
-lmkl_intel_lp64 -lmkl_sequential -lmkl_core \
-lpthread -lm -ldl
all: $(objects)
$(CXX2) $(objects) -o $(EXECUTABLE) $(LDFLAGS)
$(OBJPATH)%.o: %.cpp
$(CXX2) -c $< -o $@ $(CXXFLAGS)
.PHONY: clean
clean:
rm -f $(OBJPATH)*.o $(EXECUTABLE)
< /code>
(Ldflags не были установлены мной)ldd ./main.out | grep mkl
libmkl_intel_lp64.so.2 => /opt/spack/opt/spack/linux-rocky8-icelake/oneapi-2023.2.0/intel-oneapi-mkl-2023.2.0-5k4deyq453rywyrtygtmy43k726orka5/lib/intel64/libmkl_intel_lp64.so.2 (0x0000146b5de2b000)
libmkl_sequential.so.2 => /opt/spack/opt/spack/linux-rocky8-icelake/oneapi-2023.2.0/intel-oneapi-mkl-2023.2.0-5k4deyq453rywyrtygtmy43k726orka5/lib/intel64/libmkl_sequential.so.2 (0x0000146b5c4a9000)
libmkl_core.so.2 => /opt/spack/opt/spack/linux-rocky8-icelake/oneapi-2023.2.0/intel-oneapi-mkl-2023.2.0-5k4deyq453rywyrtygtmy43k726orka5/lib/intel64/libmkl_core.so.2 (0x0000146b58131000)
< /code>
Затем я запускаю следующие строки < /p>
export MKL_VERBOSE=1
export MKL_NUM_THREADS=1
mpiexec -np 2 ./main.out > mkl_verbose.dat
< /code>
(я настраиваю экспорт mkl_num_threads = 1, поскольку моя программа параллелизирована с MPI, и я не хочу, чтобы MKL OpenMP мешал.)
от MKL_VERBOSE.DAT Я могу видеть, что некоторые вызовы Lapack /MKL, такие как < /p>
MKL_VERBOSE ZGEMV(N,24,144,0x7ffe2183fa00,0x160e400,24,0x162dd40,1,0x7ffe2183f9f0,0x15f2340,1) 1.31us CNR:OFF Dyn:1 FastMM:1
------
MKL_VERBOSE DPOTRF(L,400,0x16d6040,400,0) 644.01us CNR:OFF Dyn:1 FastMM:1
MKL_VERBOSE DGEMV(T,8,8,0x7ffe2183fb18,0x1802c80,400,0x1629100,1,0x7ffe2183fb20,0x16290c0,1) 3.57us CNR:OFF Dyn:1 FastMM:1
MKL_VERBOSE DGEMV(T,16,8,0x7ffe2183fb18,0x17fc840,400,0x16290c0,1,0x7ffe2183fb20,0x1629080,1) 581ns CNR:OFF Dyn:1 FastMM:1
MKL_VERBOSE DGEMV(T,24,8,0x7ffe2183fb18,0x17f6400,400,0x1629080,1,0x7ffe2183fb20,0x1629040,1) 127ns CNR:OFF Dyn:1 FastMM:1
MKL_VERBOSE DGEMV(T,32,8,0x7ffe2183fb18,0x17effc0,400,0x1629040,1,0x7ffe2183fb20,0x1629000,1) 108ns CNR:OFF Dyn:1 FastMM:1
MKL_VERBOSE DGEMV(T,40,8,0x7ffe2183fb18,0x17e9b80,400,0x1629000,1,0x7ffe2183fb20,0x1628fc0,1) 123ns CNR:OFF Dyn:1 FastMM:
< /code>
И поэтому это касается других ... Все имеет смысл, так как я могу связывать эти вызовы с определенными строками в моем коде. Хотя в пространстве, занятом --- я ожидаю, что вызов DGEMM, связанный с < /p>
S_mean.noalias()=X_alltoall*X_alltoall.transpose()+bias_S2*Eigen::MatrixXd::Identity(2*N*numprocs, 2*N*numprocs);
< /code>
, который является узким местом моего кода. С < /p>
MatrixXd S_mean;
MatrixXd X_alltoall;
X_alltoall.setZero(2*N*numprocs, SR_parameters/numprocs);
S_mean.setZero(2*N*numprocs, 2*N*numprocs);
, где x_alltoall имеет размер 400x4500
Я также тестировал на отдельном основном, что, если я умножаю матрицы размера 10000x10000 dgemm, не отображается в mkl_verbose.dat. Более того, если я явно использую функции MKL/Lapack, все работает. Таким образом, кажется, что это собственный выбор, чтобы не использовать лапак. Кто -нибудь знает, что я делаю не так?
У меня есть код C ++, который использует собственные расчеты линейной алгебры. Код работает на кластере, где есть модуль с Intel MKL. Я совершенно не знаю о том, как это сделать, но я хотел попытаться связать MKL, чтобы использовать реализации Lapack, чтобы увидеть, смогу ли я получить ускорение. < /P> То, что я сделал (большинство вещей, которые я должен признать под предложением чат -бота), является < /p> Добавить в Bash.rc эти две линии: < /p>
.[code]module load intel-oneapi-mkl/2023.2.0-oneapi-2023.2.0-5k4deyq export MKLROOT=/opt/spack/opt/spack/linux-rocky8-icelake/oneapi-2023.2.0/intel-oneapi-mkl-2023.2.0-5k4deyq453rywyrtygtmy43k726orka5 < /code> Скомпилируется со следующим Makefile < /p> CXX := g++ CXX2 := mpicxx
.PHONY: clean clean: rm -f $(OBJPATH)*.o $(EXECUTABLE) < /code> (Ldflags не были установлены мной)ldd ./main.out | grep mkl libmkl_intel_lp64.so.2 => /opt/spack/opt/spack/linux-rocky8-icelake/oneapi-2023.2.0/intel-oneapi-mkl-2023.2.0-5k4deyq453rywyrtygtmy43k726orka5/lib/intel64/libmkl_intel_lp64.so.2 (0x0000146b5de2b000) libmkl_sequential.so.2 => /opt/spack/opt/spack/linux-rocky8-icelake/oneapi-2023.2.0/intel-oneapi-mkl-2023.2.0-5k4deyq453rywyrtygtmy43k726orka5/lib/intel64/libmkl_sequential.so.2 (0x0000146b5c4a9000) libmkl_core.so.2 => /opt/spack/opt/spack/linux-rocky8-icelake/oneapi-2023.2.0/intel-oneapi-mkl-2023.2.0-5k4deyq453rywyrtygtmy43k726orka5/lib/intel64/libmkl_core.so.2 (0x0000146b58131000) < /code> Затем я запускаю следующие строки < /p> export MKL_VERBOSE=1 export MKL_NUM_THREADS=1 mpiexec -np 2 ./main.out > mkl_verbose.dat < /code> (я настраиваю экспорт mkl_num_threads = 1, поскольку моя программа параллелизирована с MPI, и я не хочу, чтобы MKL OpenMP мешал.) от MKL_VERBOSE.DAT Я могу видеть, что некоторые вызовы Lapack /MKL, такие как < /p> MKL_VERBOSE ZGEMV(N,24,144,0x7ffe2183fa00,0x160e400,24,0x162dd40,1,0x7ffe2183f9f0,0x15f2340,1) 1.31us CNR:OFF Dyn:1 FastMM:1 ------ MKL_VERBOSE DPOTRF(L,400,0x16d6040,400,0) 644.01us CNR:OFF Dyn:1 FastMM:1 MKL_VERBOSE DGEMV(T,8,8,0x7ffe2183fb18,0x1802c80,400,0x1629100,1,0x7ffe2183fb20,0x16290c0,1) 3.57us CNR:OFF Dyn:1 FastMM:1 MKL_VERBOSE DGEMV(T,16,8,0x7ffe2183fb18,0x17fc840,400,0x16290c0,1,0x7ffe2183fb20,0x1629080,1) 581ns CNR:OFF Dyn:1 FastMM:1 MKL_VERBOSE DGEMV(T,24,8,0x7ffe2183fb18,0x17f6400,400,0x1629080,1,0x7ffe2183fb20,0x1629040,1) 127ns CNR:OFF Dyn:1 FastMM:1 MKL_VERBOSE DGEMV(T,32,8,0x7ffe2183fb18,0x17effc0,400,0x1629040,1,0x7ffe2183fb20,0x1629000,1) 108ns CNR:OFF Dyn:1 FastMM:1 MKL_VERBOSE DGEMV(T,40,8,0x7ffe2183fb18,0x17e9b80,400,0x1629000,1,0x7ffe2183fb20,0x1628fc0,1) 123ns CNR:OFF Dyn:1 FastMM: < /code> И поэтому это касается других ... Все имеет смысл, так как я могу связывать эти вызовы с определенными строками в моем коде. Хотя в пространстве, занятом --- я ожидаю, что вызов DGEMM, связанный с < /p> S_mean.noalias()=X_alltoall*X_alltoall.transpose()+bias_S2*Eigen::MatrixXd::Identity(2*N*numprocs, 2*N*numprocs); < /code> , который является узким местом моего кода. С < /p> MatrixXd S_mean; MatrixXd X_alltoall; X_alltoall.setZero(2*N*numprocs, SR_parameters/numprocs); S_mean.setZero(2*N*numprocs, 2*N*numprocs); [/code] , где x_alltoall имеет размер 400x4500 Я также тестировал на отдельном основном, что, если я умножаю матрицы размера 10000x10000 dgemm, не отображается в mkl_verbose.dat. Более того, если я явно использую функции MKL/Lapack, все работает. Таким образом, кажется, что это собственный выбор, чтобы не использовать лапак. Кто -нибудь знает, что я делаю не так?
У меня есть код C ++, который использует собственные расчеты линейной алгебры. Код работает на кластере, где есть модуль с Intel MKL. Я совершенно не знаю о том, как это сделать, но я хотел попытаться связать MKL, чтобы использовать реализации BLAS,...
Я получаю случайное значение -nan или nan после выполнения матричного умножения. Я использую DCM для поворота координат, скорости и ускорения, а результат сохраняется в файлах HarmonizeCoordinates, HarmonizeVelocity и HarmonizeAceleration...
Я получаю случайное значение -nan или nan после выполнения матричного умножения. Я использую DCM для поворота координат, скорости и ускорения, а результат сохраняется в файлах HarmonizeCoordinates, HarmonizeVelocity и HarmonizeAceleration...
Я столкнулся с проблемой производительности при выполнении операций умножения матриц с использованием библиотек Eigen и ViennaCL на C++. Я сравниваю производительность выполнения этих операций на встроенном графическом процессоре моей системы и на...
Мне нужно выполнить вычисления для каждой записи матрицы в Rcpp::List. Список содержит произвольную комбинацию плотных и разреженных матриц. Этот список передается в C++ из R. Мой вопрос касается как подходов к реализации, так и эффективности. Моя...