2012-06-14 2 views
1

Согласно моим измерениям dgemm как из кубас, так и из атласа, атлас резко превосходит cublas с точки зрения скорости. Ожидается ли это для системы с Intel i7 950 и Nvidia GTX470?Должны ли cublas быть превзойденными атласом?

Я тестировал матрицы размером 10x10 до 6000x6000 с шагом 50. Атлас всегда выигрывает. Я измеряю как общее выполнение приложения, так и шаг умножения.

У кого-нибудь еще есть опыт работы с этим? Это ожидаемые результаты?

Заранее спасибо.

редактировать: (тот же код, те же результаты на Xeon X5670 и Nvidia Tesla C2050)

edit2: Оказывается большой медлительностью, если отнести к инициализации библиотеки cublas. Я продолжаю работать над этим. Я расскажу об этом, когда узнаю больше.

+1

Нет, это не ожидаемый результат, особенно для C2050. Можете ли вы показать код и фактические номера GFLOP/s для случая CUBLAS? – talonmies

+1

Ускорители не полезны для однократных операций, поскольку копирование данных в/из памяти ускорителя и синхронизация при выполнении ядра могут занимать гораздо больше времени, чем фактическое вычисление. Вы действительно должны делать много вычислений на данных, которые находятся на графической карте, не перемещая их туда и сюда. GTX470 имеет двойную точность, искаженную до 1/4 от того, что ядро ​​способно, поэтому оно не будет конкурировать с high-end Quadros и Teslas. –

+2

Если вы работаете в Linux, я рекомендую запустить режим nvidia-smi в режиме сохранения (или запустить его в режиме циклизации (-l) в фоновом режиме). Это может уменьшить создание контекста устройства за пару секунд до нескольких миллисекунд. Если вы публикуете код, который вы используете для запуска и времени cublas, мы можем помочь вам убедиться, что это правильно. – harrism

ответ

1

Вы использовали однопоточные версии обеих библиотек? Насколько я понимаю, и GotoBLAS, и Atlas склонны скрытно использовать несколько потоков при работе над большими матрицами.

При этом при больших размерах матрицы используемый алгоритм имеет тенденцию иметь значение гораздо больше, чем реализация на низком уровне. Наивное матричное умножение - O (N^3), тогда как алгоритм Штрассена намного лучше, примерно O (N^2,81) или около того. Тем не менее, алгоритм Штрассена, как правило, очень хорошо викторизует (в гораздо более крупные регистры SSE и AVX, что дает почти 2-8-кратное повышение эффективности, в зависимости от формата с плавающей запятой и размера регистра).

Я не уверен, насколько хорошо оба упомянутых вами графических процессора обрабатывают математику с двойной точностью. Как правило, они оптимизированы для одинарной точности (32-битные поплавки), отбрасывая на треть или четверть этой скорости при работе с парными.

В ваших тестах есть другие факторы, которые могут исказить результаты. Например, вы можете включить время передачи матрицы в CPU. Независимо от того, соответствует ли это случаям использования в реальном мире, я не знаю; У меня нет графического процессора Nvidia для тестирования. Но я подозреваю, что нет. Обычно существует несколько операций, и матрица не требуется переносить между операциями.

Я писал свои собственные низкоуровневые матричные функции SSE3, используя встроенные функции SSE/AVX, предоставляемые компиляторами GCC и ICC C99; раннее тестирование указывает на то, что он превосходит текущие реализации Fortran с большим отрывом, особенно в очень малых (например, до 8х8, оптимизированных для каждого размера) и очень больших (выше 1000х1000, используя алгоритм Штрассена) размеров для плотных матриц.

+0

Наивная матрица mul также будет хорошо прорисовываться, не так ли? Как ваш собственный низкий уровень против атласа или GotoBLAS? – osgx