Безопасно ли устанавливать элементы унифицированного массива в 0 с помощью операций CUBLAS / CUSPARSE? - PullRequest
0 голосов
/ 13 марта 2012

Когда, например, накапливаются результаты различных умножений матрицы на вектор (что вы и делаете в BLAS, даже если есть только один элемент накопления), каждый формально начинается с нулевого вектора.Но нет способа без лишних накладных расходов напрямую выделить массив нулей в памяти устройства CUDA (или есть?), Поэтому решение, которое приходит на ум, состоит в том, чтобы просто взять массив с произвольными числами и вместо того, чтобы инициализировать его как 0передайте значение beta = 0. на первый вызов cublas<t>gemv или cusparse<t>csrmv.В конце концов, если у него есть этот параметр «почему бы не использовать его».

Является ли это

  • хорошей идеей?Или регистр β = 1 оптимизирован таким образом, чтобы повысить общую производительность при инициализации массива равным 0, а затем использовать безопасный вызов cusparseDcsrmv(..., 1., zeroes_array)?
  • ?Наивно, плавающие точки как представления ℝ элементов должны удовлетворять x = 0 = 0 ∀ x , но этот наивный подход, конечно, часто довольно смертоносен при работе с плавающими точками.Я вполне уверен, что безопасен , когда массив ранее использовался для некоторых других операций с тем же типом данных, где результат был корректным, но также безопасен ли он для унитизированного блока недавно выделенного устройствапамять?

Меня в основном интересует разреженный случай, поскольку для плотных матриц сложность умножения O ( n ²) делает его ненужнымслишком много рассуждать о производительности выделения O ( n ) вектора.

1 Ответ

1 голос
/ 13 марта 2012

Это должно быть совершенно безопасно и выполняется постоянно;любой пакет, который не будет корректно работать при β = 0, будет иметь серьезную ошибку.

В документации cusparse для csrmv, в частности, сказано, что «если бета равна нулю, y не обязательно должен быть допустимым вводом»,и LAPACK говорит что-то похожее для * gemv («Когда BETA задается как ноль, тогда Y не нужно устанавливать на входе»)

Что касается оптимизаций, это может быть случай, когда бета = 1 и бета = 0 имеютконкретные пути оптимизированного кода для любой реализации, но не могут;возможно, если нет, то и нет.

...