Стандартный интерфейс Fortran для cuBLAS
Я использую коммерческое программное обеспечение для моделирования в Linux, которое выполняет интенсивные манипуляции с матрицами. Программное обеспечение по умолчанию использует Intel MKL, но позволяет мне заменить его собственной библиотекой BLAS/LAPACK. Эта библиотека должна быть библиотекой общего объекта (.so) и должна экспортировать стандартные процедуры BLAS и LAPACK. Программное обеспечение требует стандартный интерфейс Fortran для всех из них.
Чтобы убедиться, что я могу использовать собственную библиотеку, я скомпилировал ATLAS и связал внутри нее LAPACK (из netlib). Программа смогла без проблем использовать мою скомпилированную версию ATLAS.
Теперь я хочу, чтобы программное обеспечение использовало cuBLAS для повышения скорости симуляции. Я столкнулся с проблемой, что cuBLAS не экспортирует стандартные имена функций BLAS (у них есть cublas
префикс). Более того, библиотека cuBLAS не содержит подпрограмм LAPACK. я использую readelf -a
проверить экспортируемую функцию.
С другой стороны, я пытался использовать MAGMA для решения этой проблемы. Мне удалось скомпилировать и связать его со всеми ATLAS, LAPACK и cuBLAS. Но все равно он не экспортирует правильные функции и не включает LAPACK в окончательный общий объект. Я не уверен, если это так, как я должен был, или я сделал что-то не так во время процесса сборки.
Я также нашел CULA, но я не уверен, решит ли это проблему или нет.
Кто-нибудь пытался связать cuBLAS/LAPACK (или надлежащую оболочку) в единый (.so) экспорт стандартного интерфейса Fortran с правильными именами функций? Я считаю, что это концептуально возможно, но я не знаю, как это сделать!
1 ответ
обновленный
Как указывает @talonmies, CUDA предоставила интерфейс оболочки thurking thunking.
http://docs.nvidia.com/cuda/cublas/index.html
Вы должны быть в состоянии запустить ваше приложение с ним. Но вы, вероятно, не получите никакого улучшения производительности из-за проблемы с выделением / копированием mem, описанной ниже.
старый
Это может быть нелегко. CUBLAS и другие интерфейсы библиотек CUDA предполагают, что все данные уже сохранены в памяти устройства, однако в вашем случае все данные все еще находятся в оперативной памяти ЦП перед вызовом.
Возможно, вам придется написать свою собственную обертку, чтобы иметь дело с этим, как
void dgemm(...) {
copy_data_from_cpu_ram_to_gpu_mem();
cublas_dgemm(...);
copy_data_from_gpu_mem_to_cpu_ram();
}
С другой стороны, вы, вероятно, заметили, что на каждый вызов BLAS требуется 2 копии данных. Это может привести к значительным накладным расходам и замедлить общую производительность, если большинство ваших вызовов не являются операциями BLAS 3.