Я портировал код BLAS на CUBLAS. Используемая мной библиотека BLAS - ATLAS, поэтому то, что я говорю, может быть правильным только до выбора библиотеки BLAS.
ATLAS BLAS требует, чтобы вы указали, используете ли вы основной порядок столбцов или основной порядок строк, и я выбрал основной порядок столбцов, так как я использовал CLAPACK, который использует основной порядок столбцов. LAPACKE, с другой стороны, использовал бы порядок следования строк. CUBLAS - это основной порядок столбцов. Возможно, вам придется настроить соответственно.
Даже если заказ не является проблемой, перенос на CUBLAS ни в коем случае не был заменой. Самая большая проблема заключается в том, что вы должны перемещать данные в пространство памяти GPU и из него. Эта память настраивается с использованием cudaMalloc () и освобождается с помощью cudaFree (), которая действует, как и следовало ожидать. Вы перемещаете данные в память GPU с помощью cudaMemcpy (). Время для этого будет большим фактором, определяющим, стоит ли переходить с CPU на GPU.
Как только это будет сделано, звонки будут довольно похожими. CblasNoTrans становится CUBLAS_OP_N, а CblasTrans становится CUBLAS_OP_T. Если ваша библиотека BLAS (как это делает ATLAS) позволяет передавать скаляры по значению, вам придется преобразовать их в передачу по ссылке (как обычно для FORTRAN).
Учитывая это, любой переключатель, который позволяет выбирать ЦП / ГП, легче всего будет на более высоком уровне, чем в функции, использующей BLAS. В моем случае у меня есть варианты алгоритмов для CPU и GPU, и я выбрал их на более высоком уровне в зависимости от размера проблемы.