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