2013-08-22 2 views
1

Я только начинаю программировать CUBLAS/CUDA. В основном я использую это матричные и векторные операции. Я довольно запутываю ориентацию вектора, используемого в CUBLAS. Кажется, что нет никакой разницы между вектором строки и столбца. Итак, если я использую функцию уровня 2 для умножения матрицы с вектором, как я могу определить ориентацию вектора? Будет ли он всегда рассматриваться как вектор-столбец? Если я хочу умножить вектор-столбец (nx1) на вектор строки (1xm), чтобы сделать матрицу (nxm), должен ли я всегда рассматривать их как матрицу и использовать функцию уровня 3 для умножения?путают в строке/столбце в CUBLAS

Кроме того, я использую тягу для генерации вектора, поэтому, если я передаю вектор тяги (n элементов) в cublasCgemm, чтобы сформировать матрицу 1xn или nx1 (т. Е. Строку или вектор-столбец). Будет ли этот вектор рассматриваться как вектор 1xn или nx1, если я установил cublasOperation_t как CUBLAS_OP_N?

Спасибо.

ответ

1

Все данные хранятся в одиночных указателях, то есть double*. Они сохраняются в памяти последовательно. Нет никакой разницы между векторами строк и столбцов. Отдельные указатели также используются для 2D-массивов. CUBLAS дает вам легко определить для поиска элементов в матрице

#define IDX2F(i,j,ld) ((((j)-1)*(ld))+((i)-1)) 

где i является строкой, j является колонкой и ld является ведущей размерностью матрицы. ld используется, если вы хотите использовать подматрицу полной матрицы в операции.

Умножение (nx1) (1xm) = (nxm) выполняется функцией cublasDger.

cublasStatus_t cublasDger (cublasHandle_t ручка, Int м, Int N, Const двойной * альфа, константные двойной * х, INT incx, Const двойной * у, Int incy, двойной * А, INT LDA) Если например, y является частью матрицы (kxm), затем используйте incy=k.

+0

Это помогает. Я думаю, что cublasDger - это то, что мне нужно. Но я очень запутался в формате хранения. Я читаю некоторые сведения об использовании CUBLAS. Он сказал, что C имеет другой формат хранения как fortran. Поэтому, если для умножения C (mxk) = A (mxn) x B (nxk), которые хранятся в формате C, то каковы ведущие размеры, которые я должен ввести в cublasDgemm? – user1285419

+0

Вам может быть интересен мой ответ [здесь] (http://stackoverflow.com/questions/18252526/matrix-multiplication-giving-wrong-output/18292753#18292753), который обеспечивает полностью обработанный пример использования cublas gemm с C -строчные 2D-массивы. –

+0

Документация _CUDA Toolkit Documentation в [CUBLAS/Data layout] (http://docs.nvidia.com/cuda/cublas/index.html#data-layout) гласит, что библиотека CUBLAS использует хранилище основных столбцов для максимальной совместимости с существующим Fortran сред. Также предлагается: _ Для кода Fortran, по-механически переведенного на C, можно предпочесть сохранить индексирование на основе 1, чтобы избежать необходимости преобразования циклов_. Поэтому относительно BLAS, выбирающего формат хранения в столбце (Fortran), является разумным выбором. В противном случае вам нужно преобразовать все матрицы из C в Fortran, прежде чем вызывать cublasDgemm. – ztik