我正在開發C++中的線性代數工具,它主要依賴於矩陣乘法和分解(如LU,SVD),並且意在應用於大型矩陣。我使用英特爾MKL開發了最佳性能,但我不想發佈僅限英特爾MKL版本,因爲我認爲它不適用於沒有英特爾的用戶或不想安裝MKL的用戶。相反,我應該發佈一個不是英特爾MKL特定的更通用的代碼,而是允許用戶指定他們想要使用的BLAS和LAPACK的實現(例如OpenBLAS或ATLAS)。推廣到多個BLAS/LAPACK庫
雖然函數原型在實現中似乎是相同的,但有幾個(helper?)函數和類型是特定於英特爾MKL的。例如,我使用的是MKL_INT類型,也有mkl_malloc。這個article建議使用宏來重新定義類型,這也是我的第一個想法。我想我也會爲頭文件提供宏。
我相信這是編寫代碼的標準,它對BLAS/LAPACK實現是不可知的,我想知道是否有比依賴宏更清晰的方式 - 特別是因爲後者需要重新編譯代碼切換,其中does not seem to be necessary用於我已經使用的其他工具。
這很好,謝謝你Gavin。對於特定於MKL的頭文件,如mkl.h和mkl_lapacke.h,如何? –
大多數人都有一個通用的lapack.h/blas1.h/blas2.h/etc,你可以從任何實現中獲取並保存在你自己的代碼庫中。有些人選擇在編譯時將它指定到實現頭(即'gcc -I $(MY_LAPACK_HEADER_DIR)...')。我通常選擇前者...然後你不應該需要任何東西的mkl.h –
你的後一個選項不是立即清楚的我......你正在傳遞目錄,但你在哪裏指定文件的實際名稱(mkl.h)?你會在這種情況下使用宏嗎? –