我最近正在閱讀 cBLAS 中的一些源代碼,有些東西讓我不清楚。在許多函式中,.c 檔案呼叫 Fortran Wrapper 而不是直接在 C 檔案中撰寫代碼,如以下檔案:
/*
* cblas_sdsdot.c
*
* The program is a C interface to sdsdot.
* It calls the fortran wrapper before calling sdsdot.
*
* Written by Keita Teranishi. 2/11/1998
*
*/
#include "cblas.h"
#include "cblas_f77.h"
float cblas_sdsdot( const int N, const float alpha, const float *X,
const int incX, const float *Y, const int incY)
{
float dot;
#ifdef F77_INT
F77_INT F77_N=N, F77_incX=incX, F77_incY=incY;
#else
#define F77_N N
#define F77_incX incX
#define F77_incY incY
#endif
F77_sdsdot_sub( &F77_N, &alpha, X, &F77_incX, Y, &F77_incY, &dot);
return dot;
}
我很困惑,為什么要這樣做?是不是因為 Fortran 計算效率更高?
uj5u.com熱心網友回復:
“我想問的實際上是為什么需要一個中間包裝器,為什么不用 C 撰寫它?”
整個 CBLAS 是 BLAS 的包裝器。BLAS 是使用參考 Fortran 實作和Fortran API 定義的。BLAS 可以用 C 或匯編實作,但 API 設定為 Fortran。
因此 CBLAS 實際上并不包含全部功能。該功能存在于您安裝的任何 BLAS 實作中。非常常見的參考實作是用 Fortran 撰寫的,但它不是最快的。
但是,您可能可以sdsdot直接從 C呼叫該函式(以實際實作的任何語言)cblas_sdsdot。CBLAS 的作者選擇實作一個 Fortran 中間子程式sdsdotsub。我不知道為什么現在有必要這樣做。差別很小,真的只是把一個函式改成一個子程式而已。
正如@jxh 正確評論的那樣,呼叫函式與呼叫子例程(類似于 void 函式)存在更大的 ABI 不兼容風險。也許,例如,stdcall 和 cdecl - 如果 C 編譯器使用一個,而 Fortran 編譯器使用另一個設定。
轉載請註明出處,本文鏈接:https://www.uj5u.com/net/322566.html
