Отлаживаю программы на MPI вот так:
mpirun -n 4 st -e gdb -ex run ./main
Писать эффективные вычматы на чистом C — содомия, поскольку кроме убогого препроцессора средств метапрограммирования нет.
Альтернатвы:
1) Более лучший препроцессор, например erb
(Ruby). Минус — неудобно возиться с получившимся выхлопом (отладка, балансировка скобочек, етц).
2) Языки, в которых можно явно указать, какие вычисления будут происходить в compile-time. Например, C++ (шаблоны, constexpr).
Хочу попробовать D в качестве второй альтернативы. Есть гнутый компилятор, который [по мнению авторитетных анонимных экспертов] даёт на выхлопе код, не хуже, чем gcc.
Вот есть такая штука:
template<class F>
void foo(F f) {
for(int i = 0; i < 100; i++)
f(i);
}
Наверное, это очевидно, но gcc не инлайнит¹ вызов f
, если f
- это функция. Поэтому приходится писать
template <void f(int)>
void foo() { /* ... */ }
Либо оборачивать f
в какую-нибудь лямбду или класс с оператором ()
.
1) На самом деле инлайнит, если foo()
используется только один раз в коде.