Прежде всего, вам действительно нужно профилировать низкоуровневую коммуникацию, такую как MPI? Разве вы не можете вместо этого просто спланировать свои высокоуровневые подпрограммы?
В любом случае, довольно легко написать свой собственный профилировщик MPI. Практически все библиотеки MPI (включая Open MPI) экспортируют свои функции (например, MPI_Send
) как слабые псевдонимы одних и тех же функциональных символов с префиксом P
(например, PMPI_Send
). Все, что вам нужно сделать, это определить свои собственные функции с теми же прототипами, что и в библиотеке MPI. Внутри обновите счетчики вызовов, запустите таймеры, затем вызовите исходную функцию MPI с префиксом P
и по возвращении остановите таймеры:
extern "C"
int MPI_Send(void *buf, int count, MPI_Datatype dtype, int dest, int tag, MPI_Comm comm) {
// Update call counters and start the timer
calls["MPI_Send"]++;
timers["MPI_Send"].start();
// Call the original MPI function
int result = PMPI_Send(buf, count, dtype, dest, tag, comm);
// Stop the timer
timers["MPI_Send"].stop();
return result;
}
Часть extern "C"
важна, иначе вы не переопределит правильный слабый символ, если вы пишете на C ++.
Эта возможность переопределить символы из библиотеки MPI стандартизирована - см. # 14.2 Интерфейс профилирования в текущей версии стандарта .