Eigen + MKL на кластере не вызывает GEMM для умножения больших матрицC++

Программы на C++. Форум разработчиков
Ответить Пред. темаСлед. тема
Anonymous
 Eigen + MKL на кластере не вызывает GEMM для умножения больших матриц

Сообщение Anonymous »

У меня есть код 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, все работает. Таким образом, кажется, что это собственный выбор, чтобы не использовать лапак. Кто -нибудь знает, что я делаю не так?

Подробнее здесь: https://stackoverflow.com/questions/796 ... plications
Реклама
Ответить Пред. темаСлед. тема

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

  • Похожие темы
    Ответы
    Просмотры
    Последнее сообщение

Вернуться в «C++»