2015-06-11 34 views
2

「CUDA C++」語言是一種C++派生語言,但它不被標準編譯器支持,但可以由nVidia的nvcc編譯器編譯。這可能導致多語言項目,其GPU模塊用nvcc編譯,而非GPU模塊用gcc編譯。CUDA是否包含真正的C++庫?

例如,語法kernel<<<dims>>>(params)不是C++的一部分。

nVidia是否包含一個GPU庫(作爲CUDA的一部分),它實際上可以與標準C++編譯器(如gcc)一起使用?

+2

CUDA驅動程序API執行您(我認爲)所詢問的內容。驅動程序API代碼根本不需要nvcc來構建,並且內核可以在運行時由驅動程序進行JIT編譯(只有在內核使用PTX編寫時纔可以編譯) – talonmies

回答

8

CUDA GPU需要爲GPU編譯器件代碼,這與您在爲x86目標編譯的典型庫中找到的x86機器代碼不同。

因此,要使用GPU,不知何故,您將需要nvidia編譯器來生成機器碼。

有不同的方法來實現:

  1. 使用庫。隨CUDA一起提供的庫(如CUBLAS,CUSPARSE,CUSOLVER和CUFFT)包含可從常規主機代碼調用並鏈接的預編譯的GPU例程。這些庫都可以與標準的C++編譯器(如g ++)一起使用。

  2. 來自cuda driver API和cuda runtime API的大部分例程都可以使用標準C++編譯器從普通主機代碼調用和鏈接。然而,這並沒有解決如何處理設備代碼的問題。如果使用驅動程序API(不包括類似kernel<<<...>>>的語法元素)在PTX form中提供設備代碼,則不需要nvcc,並且可以使用標準編譯器(如g ++)完全構建應用程序。

  3. 如果設備代碼在C/C++源形式遞送(即CUDA C/C++),然後通常NVCC將需要任何轉換代碼,以PTX(所以上述可使用方法2)或轉換直接轉換爲二進制編譯格式,驅動程序API或運行時API均可使用該格式。

  4. 未來,您可能還需要關注CUDA runtime compilation mechanism不斷髮展的功能。

  5. 既然您提到gcc,您可能還想關注OpenACC support in gcc不斷髮展的功能。