Я аспирант.
Во введении моей диссертации меня заинтересовал компромисс между выразительностью и характеристиками инструментов линейной алгебры.
В качестве простого примера я использую вычисление нормы векторного выражения.
Код C для моего примера:
float normExpression3(float a, float *W, float b, float *X, float c, float*Y){
double norm = 0;
for (int i=0; i<n; ++i) // n in [3e6; 2e8]
{
float tmp = a*W[i]+b*X[i]+c*Y[i];
norm+=tmp*tmp;
}
return sqrtf(norm);
}
Я сравниваю достигнутые характеристики с разными техниками.
Поскольку векторы велики (несколько миллионов элементов), производительность ограничена пропускной способностью памяти.
Однако между этими подходами существуют огромные различия.
Оптимизированная версия C, которую я написал, не выразительна (новая функция должна быть записана как 4-й вектор) и очень уродлива (с резьбой и векторизацией), но достигла 6,4 GFlops.
С другой стороны, код MATLAB очень хорош:
result = norm(a*W+b*X+c*Y)
, но достигает только 0,28 GFlops.
C ++ шаблоны выражений à la Blitz ++ обеспечивает пользователю выразительность и производительность (6,5 GFlops).
В рамках моего анализа я хотел бы знать, как функциональные языки могут сравниваться с этими подходами.
Я думал о том, чтобы показать пример в Haskell или в OCaml (AFAIK, оба, как считается, хорошо подходят для такого рода операций).
Я не знаю ни одного из этих языков. Я мог бы научиться одному из них, чтобы привести мой пример, но это не будет честным сравнением: я не уверен, что смогу обеспечить реализацию, позволяющую как выразительность, так и производительность.
Итак, два моих вопроса:
1) какой язык лучше всего подходит?
2) как можно эффективно вычислить норму векторных выражений без ущерба для общности реализации?
Заранее спасибо!
Уилфрид К.
Редактировать: исправлен тип аккумулятора norm
для float
до double