Вы использовали однопоточные версии обеих библиотек? Насколько я понимаю, и 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, используя алгоритм Штрассена) размеров для плотных матриц.
Нет, это не ожидаемый результат, особенно для C2050. Можете ли вы показать код и фактические номера GFLOP/s для случая CUBLAS? – talonmies
Ускорители не полезны для однократных операций, поскольку копирование данных в/из памяти ускорителя и синхронизация при выполнении ядра могут занимать гораздо больше времени, чем фактическое вычисление. Вы действительно должны делать много вычислений на данных, которые находятся на графической карте, не перемещая их туда и сюда. GTX470 имеет двойную точность, искаженную до 1/4 от того, что ядро способно, поэтому оно не будет конкурировать с high-end Quadros и Teslas. –
Если вы работаете в Linux, я рекомендую запустить режим nvidia-smi в режиме сохранения (или запустить его в режиме циклизации (-l) в фоновом режиме). Это может уменьшить создание контекста устройства за пару секунд до нескольких миллисекунд. Если вы публикуете код, который вы используете для запуска и времени cublas, мы можем помочь вам убедиться, что это правильно. – harrism