Извините за длинный пост, но я хотел включить все, что я думал, было актуально с первого взгляда.
Что я хочу
Я реализую параллельную версию методов подпространств Крылова для плотных матриц. В основном GMRES, QMR и CG. Я понял (после профилирования), что моя рутина DGEMV была жалкой. Поэтому я решил сосредоточиться на этом, изолируя его. Я попытался запустить его на 12-ядерном компьютере, но ниже приведены результаты для 4-ядерного ноутбука Intel i3. В тенденции не так много различий.
Мой KMP_AFFINITY=VERBOSE
вывод доступен здесь .
Я написал небольшой код:
size_N = 15000
A = randomly_generated_dense_matrix(size_N,size_N); %Condition Number is not bad
b = randomly_generated_dense_vector(size_N);
for it=1:n_times %n_times I kept at 50
x = Matrix_Vector_Multi(A,b);
end
Я считаю, что это имитирует поведение CG в течение 50 итераций.
Что я пробовал:
Перевод
Я изначально написал код на Фортране. Я перевел это на C, MATLAB и Python (Numpy). Само собой разумеется, MATLAB и Python были ужасны. Удивительно, но C был лучше, чем FORTRAN на секунду или две для вышеуказанных значений. Последовательно.
Профилирование
Я профилировал свой код для запуска, и он работал в течение 46.075
нескольких секунд. Это было, когда MKL_DYNAMIC был установлен вFALSE
и все ядра были использованы. Если бы я использовал MKL_DYNAMIC как истину, то в любой момент времени использовалась только (приблизительно) половина количества ядер. Вот несколько деталей:
Address Line Assembly CPU Time
0x5cb51c mulpd %xmm9, %xmm14 36.591s
Наиболее трудоемким процессом представляется:
Call Stack LAX16_N4_Loop_M16gas_1
CPU Time by Utilization 157.926s
CPU Time:Total by Utilization 94.1%
Overhead Time 0us
Overhead Time:Total 0.0%
Module libmkl_mc3.so
Вот несколько изображений:
Выводы:
Я настоящий новичок в профилировании, но я понимаю, что ускорение все еще не хорошо. Последовательный (1-ядерный) код завершается за 53 секунды. Это скорость меньше, чем 1,1!
Реальный вопрос: что я должен сделать, чтобы улучшить свое ускорение?
Вещи, которые, я думаю, могут помочь, но я не уверен:
- Реализация Pthreads
- Реализация MPI (ScaLapack)
- Ручная настройка (я не знаю, как. Пожалуйста, порекомендуйте ресурс, если вы предлагаете это)
Если кому-то нужно больше (особенно в отношении памяти) деталей, пожалуйста, дайте мне знать, что мне следует запускать и как. У меня никогда не было профилированной памяти раньше.