2016-05-31 78 views
2

我正在開發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用於我已經使用的其他工具。

回答

1

大多數依賴BLAS/LAPACK調用的科學代碼都是與實現無關的。他們通常要求圖書館恰如其分地聯繫起來。

您已經評論說,函數原型在不同的實現中是相同的。這允許您只需將某個myblas.hmylapack.h標題中的原型鏈接到您想要使用的任何庫。

這聽起來像是您主要關心的是您用於MKL的特定於實施的內容。解決方案是不使用這些東西。例如,像MKL_INT這樣的MKL類型並不特殊。它們是C數據類型,已經定義爲允許在MKL提供的LP32/LP64/ILP64庫之間進行概括。見this table

此外,像mkl_malloc這樣的東西並不特別。它是在C標準有一個線程安全對齊的alloc之前引入的。其實,那全是mkl_malloc是。因此,相反,只是使用aligned_alloc,或者如果你不想承諾C11使用_mm_mallocmemalign等..

在另一方面,MKL確實提供給BLAS/LAPACK一些有用的擴展,它不標準化(例如像轉座一樣)。但是,這種類型的東西通常很容易通過特殊情況BLAS/LAPACK調用來實現,或者很容易由您自己來實現。如果您選擇使用MKL,MKL也具有內部線程,但是,許多BLAS/LAPACK庫提供此功能。

+0

這很好,謝謝你Gavin。對於特定於MKL的頭文件,如mkl.h和mkl_lapacke.h,如何? –

+0

大多數人都有一個通用的lapack.h/blas1.h/blas2.h/etc,你可以從任何實現中獲取並保存在你自己的代碼庫中。有些人選擇在編譯時將它指定到實現頭(即'gcc -I $(MY_LAPACK_HEADER_DIR)...')。我通常選擇前者...然後你不應該需要任何東西的mkl.h –

+0

你的後一個選項不是立即清楚的我......你正在傳遞目錄,但你在哪裏指定文件的實際名稱(mkl.h)?你會在這種情況下使用宏嗎? –