воскресенье, 12 сентября 2010 г.

Математика в SBCL: бенчмарк

После проведения некоторых оптимизаций кода sb-math решил провести тест производительности функций умножения матрицы на матрицу и матрицы на вектор. Для сравнения взял GSLL и простым сишным кодом. Таким образом, сравнивался чистый вызов функций cblas_sgemv и cblas_sgemm из библиотеки GSL CBLAS и два интерфейса к ним.

Код бенчмарков тут:
* bench.lisp - код для gsll и sb-math, а также вызова скомпилированного сишного кода, обработки результатов и отрисовки графиков.
* gemm_bench.c, gemv_bench.c - сам сишный код
* там же графики зависимостей (png)

Итак, умножение матрицы на вектор. Для упрощения умножалась квадратная матрица NxN на вектор длиной N.





На графике показана зависимость времени единичного вычисления от размености N. на больших размерностях GSLL дает существенное отставание. Причина этого неожиданного факта не совсем понятна. Более того, полгода назад на похожем тесте для больших размерностей GSLL шла рядом с сишным кодом, а вот для малых давала из рук вон плохие результаты. Вероятно, это связано с тем, что автор GSLL (Liam Healy) недавно перекроил все матричное api для нее.

Интересно посмотреть, что там вблизи нуля, где все линии сливаются в одну.






Тут не очень интересно, поэтому чуть увеличим размерность:







Так все более-менее ясно.

Теперь умножение матрицы на матрицу. Простоты ради все матрицы квадратные, с одинаковой размерностью.






Начиная с N=200 GSLL резко уходит уходит в отрыв, sb-math продолжает преследовать gcc :)

Напоследок посмотрим поближе на результаты для малых размерностей:


Подводя итог, можно сказать, что sb-math смотрится достаточно неплохо даже на  фоне gcc, хотя на матрицах малых размерностей относительное отставание от сишного кода велико. Но там еще есть возможности для оптимизации, и это вселяет надежду :)

GSLL ведет себя достаточно странно, причем это поведение стабильно воспроизводится. Тем не менее, с новым foreign array api там все стало существенно лучше.

Ну а сишный код - что с него взять? Накладных расходов на подготовку параметров там нет, но нет и гибкости и удобства, которые дает lisp.

Ну и это самое. В отличие от GSLL sb-math не привязана к какой-то одной библиотеке CBLAS. Подключение ее к функциям из ATLAS дает существенный рост производительности по сравнению с GSLL. Тем не менее, я не стал включать в бенчмарк тесты на атласе, потому что целью было посмотреть оверхед на вызов функций. Да и не совсем честно это, что sb-math будет обгонять сишный код.

Ну вы поняли :)

UPD: В связи с глобальной переписью кода этот бенчмарк стал неактуальным. Оверхед на малых размерностях стал еще меньше.

2 комментария:

  1. Надо этот блог добавить в Russian Lisp Planet. Напиши Архимагу.

    ОтветитьУдалить
  2. Архимаг пока в отпуске. Приедет - обязательно напишу :)

    ОтветитьУдалить