Безопасно ли передавать GEMV тот же выходной сигнал, что и входной вектор, для достижения разрушительного применения матрицы? - PullRequest
4 голосов
/ 29 марта 2012

Если A является n x n матрицей и x вектор размерности n , являетсятогда можно передать x в GEMV в качестве аргумента как для параметров x, так и y, с помощью beta=0, чтобы выполнить операцию x A x ?

Меня особенно интересует реализация Cublas с интерфейсом C.

Ответы [ 2 ]

6 голосов
/ 29 марта 2012

Нет. И для Фортрана это не имеет ничего общего с реализацией - в Фортране он нарушает языковой стандарт, чтобы иметь псевдонимы фактических аргументов для подпрограммы любая , так как он нарушает языковой стандарт , если эти аргументы не являются намеренными (В). Таким образом, если интерфейс имеет фиктивные аргументы, которые являются Intent (Out), Intent (InOut) или не имеют Intent, вы всегда должны использовать отдельные переменные для соответствующих фактических аргументов при вызове подпрограммы.

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

NO.

Каждый элемент вывода зависит от ALL элементов входного вектора x

Например: если x - это вход, а y - это выход, A - это матрица, i-й элемент y будет сгенерирован следующим образом.

y_i = A_i1*x_1 + A_i2 * x_2 ... + A_in * x_n

Таким образом, если вы перезаписаете x_i результатом, указанным выше, некоторые другие x_r, зависящие от x_i, не получат надлежащий ввод и не получат неправильные результаты.

EDIT

Я собирался сделать это комментарием, но он становился слишком большим. Итак, вот объяснение, почему приведенные выше рассуждения верны и для параллельных реализаций.

Если каждая параллельная группа / поток не создает локальную копию исходных данных, и в этом случае исходные данные могут быть уничтожены, эта аргументация верна.

Однако делать это (делать локальную копию) целесообразно и полезно только тогда, когда

  1. Каждый параллельный поток / блок не сможет получить доступ к исходный массив без значительных накладных расходов.
  2. Достаточно локальной памяти (назовите это кешем, или разделяемой памятью или даже обычная память в случае MPI) для хранения отдельной копии для каждого параллельная резьба / блок.

Примечания:

  • (1) может быть неверно для многих многопоточных приложений на одном компьютере.
  • (1) может быть верно для CUDA, но (2) определенно не применимо для CUDA.
...