2016-02-05 8 views
2

В настоящее время я реализую Stochastic Gradient Descent на GPU, используя CUDA, Thrust и cuBLAS.Насколько велики должны быть матрицы, если я использую BLAS/cuBLAS, чтобы он работал лучше обычного C/CUDA?

В моей первоначальной реализации я использовал простой CUDA для выполнения операций с матричным вектором, и теперь я пытаюсь оптимизировать это, используя вместо этого cuBLAS для таких операций.

В настоящее время я наблюдаю за тем, что для матриц строк размера x cols для небольшого количества cols простая CUDA последовательно превосходит cuBLAS, по-видимому, независимо от количества строк. Однако для большого количества колонок реализация cuBLAS побеждает.

Поэтому я задавался вопросом: существуют ли какие-либо правила большого пальца/рекомендации о том, какие должны быть минимальные размеры матриц/векторов, после которых использование BLAS или cuBLAS будет лучше, чем обычный C/CUDA, или это полностью зависит от функция приложения/BLAS?

+0

Связанные вопрос: http://stackoverflow.com/q/26417475/209882 – Bar

+2

Обратите внимание, что BLAS2 (матрица-вектор) операции, как правило, ограничена пропускной способностью памяти. Если возможно, вы хотели бы использовать операции BLAS3. Существует множество различных операций BLAS2, каждый из которых имеет свои собственные характеристики производительности (которые могут отличаться по архитектуре графического процессора), поэтому ваш вопрос кажется слишком широким. Проверьте, применимы ли какие-либо пакетные операции к вашему прецеденту, поскольку они обеспечивают лучшую производительность для небольших матриц, которые в противном случае используют только часть ресурсов машины. – njuffa

+0

Вы выполняете именно то, что было в вопросе, с которым вы связались, - эталоном для вашего домена и размера проблемы и используйте эти данные для управления вашей эвристикой. Я очень * стараюсь закрыть это как дубликат этого вопроса. – talonmies

ответ

1

Я провел несколько тестов, которые я опубликую здесь: Результаты для задачи линейной регрессии, выполняющейся для 10 итераций SGD, на наборах данных со 10000 строками. В реализации и других результатов можно найти здесь: https://github.com/thvasilo/cuda-sgd-sese-project

Runtimes для 10-100 функции/колонки:

enter image description here

Так что для моей реализации изменение точки, в которой обычная CUDA становится медленнее на 50 столбцов , Существует скачок во времени выполнения для 100 функций для cuBLAS, но это может быть артефактом, эти эксперименты выполнялись только один раз, и различия все равно не велики.

При работе с большим количеством столбцов BLAS Lvl. 2 последовательно выполняет лучше:

enter image description here