У меня есть код C ++, который использует собственные расчеты линейной алгебры. Код работает на кластере, где есть модуль с Intel MKL. Я совершенно не знаю о том, как это сделать, но я хотел попытаться связать MKL, чтобы использовать реализации BLAS, чтобы увидеть, смогу ли я получить ускорение. < /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 Я вижу некоторые BLA /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. Более того, если я явно использую функцию DGEMM, все работает. Таким образом, кажется, что это собственный выбор, чтобы не использовать BLA. Кто -нибудь знает, что я делаю не так?#define EIGEN_USE_MKL_ALL
#include
#include
int main() {
using MatrixType = Eigen::Matrix;
using VectorType = Eigen::VectorXd;
MatrixType B = MatrixType::Random(10000, 10000);
MatrixType C;
C.noalias()=B.transpose()*B;
std::cout
Подробнее здесь: https://stackoverflow.com/questions/796 ... plications
Eigen + MKL на кластере не вызывает GEMM для умножения больших матриц ⇐ C++
-
- Похожие темы
- Ответы
- Просмотры
- Последнее сообщение
-
-
Операция eigen::vector3d или eigen::matrix3d, приводящая к случайному результату nan или -nan
Anonymous » » в форуме C++ - 0 Ответы
- 30 Просмотры
-
Последнее сообщение Anonymous
-
-
-
Операция eigen::vector3d или eigen::matrix3d, приводящая к случайному результату nan или -nan
Anonymous » » в форуме C++ - 0 Ответы
- 26 Просмотры
-
Последнее сообщение Anonymous
-