色哟哟视频在线观看-色哟哟视频在线-色哟哟欧美15最新在线-色哟哟免费在线观看-国产l精品国产亚洲区在线观看-国产l精品国产亚洲区久久

0
  • 聊天消息
  • 系統消息
  • 評論與回復
登錄后你可以
  • 下載海量資料
  • 學習在線課程
  • 觀看技術視頻
  • 寫文章/發帖/加入社區
會員中心
創作中心

完善資料讓更多小伙伴認識你,還能領取20積分哦,立即完善>

3天內不再提示

NVIDIA CUDA C ++編譯器的新特性

星星科技指導員 ? 來源:NVIDIA ? 作者:NVIDIA ? 2022-04-06 11:59 ? 次閱讀

CUDA 11 . 5 C ++編譯器解決了不斷增長的客戶請求。具體來說,如何減少 CUDA 應用程序構建時間。除了消除未使用的內核外, NVRTC 和 PTX 并發編譯有助于解決這個關鍵問題 CUDA C ++應用程序開發的關注點。

CUDA 11 . 5 NVCC 編譯器現在添加了對 Clang 12 . 0 作為主機編譯器的支持。我們還提供了 128 位整數支持的有限預覽版本,這在高保真計算中變得至關重要。

CUDA C ++編譯器工具鏈上的技術演練補充了編程指南(需要鏈接),并提供了在 CUDA 11 . 5 工具包版本中引入的新特性的廣泛概述。

并發編譯

NVRTC 編譯過程分為三個主要階段:

   Parser -> NVVM optimizer -> PTX Compiler

其中一些階段不是線程安全的,因此 NVRTC 以前會使用全局鎖序列化來自多個用戶線程的并發編譯請求。

在 CUDA 11 . 5 中,對 NVRTC 實現進行了增強,以提供部分并發編譯支持。這是通過移除全局鎖和使用每階段鎖來實現的,這會導致不同的線程并發執行編譯管道的不同階段。

圖 1 顯示了 CUDA 11 . 5 之前的 NVRTC 如何序列化來自四個線程的同時編譯請求。

圖 1 。序列化編譯

對于 11 . 5 , NVRTC 不會序列化編譯請求。相反,來自不同線程的編譯請求是管道化的,從而使編譯管道的不同階段能夠同時進行。

圖 2 。并發編譯

圖 3 中的圖表顯示了編譯一組 100 個相同的示例 NVRTC 程序的總編譯時間,這些程序按可用線程數進行劃分。

圖 3 。 CUDA 11 . 4 和 11 . 5 的編譯時間比較

正如所料,對于 CUDA 11 . 4 NVRTC ,總編譯時間不會隨著線程數的增加而改變,而編譯是使用全局 NVRTC 鎖序列化的。使用 CUDA 11 . 5 NVRTC ,總編譯時間會隨著線程數的增加而減少。我們將繼續使單個 stage 線程更安全,這將為本例實現近乎線性的加速。

PTX 并發編譯

沿著 JIT 編譯路徑進行 PTX 編譯,以及使用 PTX 靜態庫進行多個內部階段。這些階段以前的實現不能保證從多個線程進行并發編譯。相反, PTX 編譯器使用全局鎖來序列化并發編譯。

在 CUDA 11 . 5 和 R495 驅動程序中, PTX 編譯器實現現在使用更細粒度的本地鎖,而不是全局鎖。這允許并發執行多個編譯請求,并顯著縮短了編譯時間。

下圖顯示了編譯 104 個相同的示例程序所需的總編譯時間,這些程序在給定數量的線程上拆分到cuLinkAddData使用CU_JIT_INPUT_PTX作為CUjitInputType。

正如 R470 CUDA 驅動程序所預期的那樣,總編譯時間不會隨著線程數的增加而改變,因為編譯是用全局鎖序列化的。使用 R495 CUDA 驅動程序,總編譯時間隨著線程數的增加而減少。

圖 4 。 CUDA 11 . 4 和 11 . 5 的 PTX 并發編譯比較

消除未使用的內核

單獨編譯模式允許 CUDA 內核函數和設備函數作為 CUDA 設備代碼庫發布,并使用設備鏈接器 NVLink 針對任何用戶應用程序進行鏈接。然后在運行時在 GPU 上加載并執行生成的設備程序。

在 CUDA 11 . 5 之前, NVLink 無法確定從鏈接設備程序中刪除未使用的內核是否安全,因為這些內核函數可以從主機代碼中引用。

考慮一個定義四個內核函數的庫:

//library.cu
__global__ void AAA() { /* code */ }
__global__ void BBB() { /* code */ }
__global__ void CCC() { /* code */ }
__global__ void DDD() { /* code */ }

該庫的構建和發布:

$nvcc -rdc=true library.cu -lib -o testlib.a

用戶代碼引用庫中的單個內核:

//user.cu
extern __global__ void AAA();

int main() { AAA<<<1,1>>>(); }

代碼鏈接為:

$nvcc -rdc=true user.cu testlib.a -o user

以 CUDA 11 . 4 為例,鏈接設備程序將包含所有四個內核體,即使鏈接設備程序中只使用一個內核(“ AAA ”)。對于鏈接到較大庫的應用程序來說,這可能是一個負擔。

增加的二進制大小和應用程序加載時間并不是冗余設備代碼的唯一問題。當使用設備鏈接時間優化(DLTO –修復鏈接)時,在優化之前未刪除的未使用內核可能會導致更長的構建時間,并可能阻礙代碼優化。

使用 CUDA 11 . 5 , CUDA 編譯器將跟蹤主機代碼中對內核的引用,并將此信息傳播到設備鏈接器( NVLink )。 NVLink 然后從鏈接的設備程序中刪除未使用的內核。對于前面的示例,未使用的內核 BBB 、 CCC 和 DDD 將從鏈接設備程序中刪除。

在 CUDA 11 . 5 中,默認情況下禁用此優化,但可以通過將-Xnvlink -use-host-info選項添加到 NVCC 命令行來啟用:

$nvcc -rdc=true user.cu testlib.a -o user -Xnvlink -use-host-info

在隨后的 CUDA 工具包版本中,默認情況下將啟用優化,并提供一個退出標志。

這里有一些警告。在 CUDA 11 . 5 中,編譯器對內核引用的分析在以下情況下是保守的。編譯器可以考慮一些未從宿主代碼實際引用的內核,如:

  • 如果模板實例化是從主機代碼引用的,則該模板的所有實例都被視為是從主機代碼引用的。
template
__global__ void foo() {  }

__device__ void doit() { foo<<<1,1>>>(); }
	
int main() {

// compiler will mark all instances of foo template as referenced
// from host code, including "foo", which is only actually 
// referenced from device code
foo<<<1,1>>>();
}
  • __global__ or __device__函數體之外的任何引用都被視為主機代碼引用。
__global__ void foo() { }
__device__ auto *ptr = foo;  // foo is considered as referenced
                       	     // from host code.
  • 當對函數的引用為template-dependent時,具有該名稱的所有內核都被視為主機引用。
__global__ void foo(int) { }

namespace N1 {
template 
__global__ void foo(T) { }
}

template
void doit() {
 // the reference to 'foo' is template dependent, so 
 // both ::foo and all instances of ::N1::foo are 
 // considered as referenced from host code.
 foo<<<1,1>>>(T{});
}

另一個警告是,當設備鏈接步驟推遲到主機應用程序啟動( JIT 鏈接)時,而不是在構建時,將不會刪除未使用的內核。

// With nonvirtual architecture (sm_80), NVLink is invoked 
// at build time, and kernel pruning will occur.
$nvcc -Xnvlink -use-host-info -rdc=true foo.cu bar.cu -o foo -arch sm_80

// With virtual architecture (compute_80), NVLink is not invoked
// at build time, but only during host application startup.
// kernel pruning will not occur.
$nvcc -Xnvlink -use-host-info -rdc=true foo.cu bar.cu -o foo -arch compute_80

今后的工作

在 CUDA 11 . 5 中, NVLink 在設備鏈接時間優化( DLTO – FIXME link )期間尚未使用有關未使用內核的信息。我們的目標是使 NVLink 能夠使用此信息刪除未使用的內核,減少優化器時間,并通過減少代碼膨脹來提高生成的代碼質量。

有限的 128 位整數支持

11 . 5 CUDA C ++編譯器支持主機編譯器支持 128 位整數的平臺的 128 位整數數據類型。基本的算術、邏輯和位運算將在 128 位整數上工作。未來版本計劃支持?CUDA 固有類型?CUDA 數學函數的 128 位整數變體。

類似地,對 128 位整數的調試支持以及與開發人員工具的集成將在后續版本中提供。目前,我們正在開發者論壇上尋求您對此預覽功能的早期反饋。

NVRTC 靜態庫

CUDA 11 . 5 提供了 NVRTC 庫的靜態版本。一些應用程序可能更喜歡鏈接靜態 NVRTC 庫,以保證部署期間的穩定性能和功能。靜態庫用戶還希望靜態鏈接 NVRTC 內置庫和 PTX 編譯器庫的靜態版本。有關鏈接靜態 NVRTC 庫的更多信息,請參閱NVRTC 用戶指南

__builtin_assume

CUDA 11 . 5 改進了__builtin_assume應用于__isShared(pointer)等地址空間謂詞函數的結果時加載和存儲的代碼生成。有關其他支持的功能,請參閱地址空間謂詞函數

如果沒有地址空間說明符,編譯器將生成通用加載和存儲指令,這需要一些額外的指令來計算特定的內存段,然后再執行實際的內存操作。使用__builtin_assume(expr)提示編譯器使用泛型指針的地址空間,這可能會提高代碼的性能。

Correct Usage:

    bool b = __isShared(ptr);
    __builtin_assume(b);    // OK: Proof that ptr is a pointer to shared memory

Incorrect Usage:

These hints are ignored unless the boolean expression is stored in a separate variable:

    __builtin_assume(__isShared(ptr)); // IGNORED

與其他__builtin_assume一樣,如果表達式不為 TRUE ,則行為未定義。如果您有興趣了解__builtin_assume的更多信息,請參閱?CUDA 11 . 2 編譯器文章。

Pragma 診斷控制

在 CUDA 11 . 5 中, NVCC CUDA 編譯器前端增加了對大量雜注的支持,這些雜注提供了對診斷消息的更多控制。

您可以使用以下雜注來控制特定錯誤號的編譯器診斷:

#pragma nv_diag_suppress  // suppress the specified diagnostic 
                          // message
#pragma nv_diag_warning   // make the specified diagnostic a warning
#pragma nv_diag_error     // make the specified diagnostic an error
#pragma nv_diag_default   // restore the specified diagnostic level
                          // to default
#pragma nv_diag_once      // only report the specified diagnostic once

Uses of these pragmas have the following form:

#pragma nv_diag_xxx error_number, error_number …

要了解如何使用這些帶有更詳細警告的雜注,請參閱?CUDA 內部編程指南。以下示例將取消foo的 Clara 選項上的“declared but never referenced”警告:

#pragma nv_diag_suppress 177
void foo()
{
  int xxx=0;
}

雜注nv_diagnostic推送和nv_diagnostic彈出可用于保存和恢復當前診斷pragma狀態:

#pragma nv_diagnostic push
#pragma nv_diag_suppress 177
void foo()
{
  int xxx=0;
}
#pragma nv_diagnostic pop
void bar()
{
  int xxx=0;
}

這些雜注都不會對主機編譯器產生任何影響。

推薦使用注意:不帶nv_前綴的診斷雜注已不推薦使用。例如,#pragma diag_suppress支持將從所有未來版本中刪除。使用這些診斷標記將引發如下警告消息:

pragma "diag_suppress" is deprecated, use "nv_diag_suppress" instead

__NVCC_DIAG_PRAGMA_SUPPORT__有助于過渡到使用新宏:

#ifdef __NVCC_DIAG_PRAGMA_SUPPORT__
#pragma nv_diag_suppress 177
#else
#pragma diag_suppress 177
#endif

新選項 -arch = all | all major

在 CUDA 11 . 5 版本之前,如果您想為所有受支持的體系結構生成代碼,必須在--generate-code選項中列出所有目標。如果添加了較新的版本,或舊版本失效,則必須相應地更改--generate-code選項。現在,新選項-arch=all|all-major提供了一種更簡單、更高效的方法。

如果指定了-arch=all, NVCC 將為所有受支持的體系結構(sm_*)嵌入編譯后的代碼映像,并為最高的主要虛擬體系結構嵌入 PTX 程序。

如果指定了-arch=all-major, NVCC 將為所有受支持的主要版本(sm_*0)嵌入編譯后的代碼映像,從最早受支持的sm_x體系結構(此版本為sm_35)開始,并為最高的主要虛擬體系結構嵌入 PTX 程序。

例如,簡單的-arch=all選項相當于此版本的以下一長串選項:

-gencode arch=compute_35,"code=sm_35" 
-gencode arch=compute_37,"code=sm_37" 
-gencode arch=compute_50,"code=sm_50" 
-gencode arch=compute_52,"code=sm_52" 
-gencode arch=compute_53,"code=sm_53"
-gencode arch=compute_60,"code=sm_60" 
-gencode arch=compute_61,"code=sm_61" 
-gencode arch=compute_62,"code=sm_62" 
-gencode arch=compute_70,"code=sm_70" 
-gencode arch=compute_72,"code=sm_72" 
-gencode arch=compute_75,"code=sm_75" 
-gencode arch=compute_80,"code=sm_80" 
-gencode arch=compute_86,"code=sm_86" 
-gencode arch=compute_87,"code=sm_87" 
-gencode arch=compute_80,"code=compute_80"

簡單的-arch=all-major選項相當于此版本的以下一長串選項:

-gencode arch=compute_35,"code=sm_35" 
-gencode arch=compute_50,"code=sm_50" 
-gencode arch=compute_60,"code=sm_60" 
-gencode arch=compute_70,"code=sm_70" 
-gencode arch=compute_80,"code=sm_80" 
-gencode arch=compute_80,"code=compute_80"

有關所有受支持的虛擬體系結構,請參閱虛擬體系結構功能列表。有關所有受支持的真實體系結構,請參閱?GPU 功能列表

確定性代碼生成

在以前的 CUDA 工具包中,設備代碼中內部鏈接變量或函數的名稱在每次 nvcc 調用時都會更改,即使源代碼沒有更改。某些軟件管理和構建系統檢查生成的程序位是否已更改。先前的 nvcc 編譯器行為導致此類系統觸發,并錯誤地假設源程序中存在語義更改;例如,可能觸發冗余的依賴生成。

在 CUDA 11 . 5 中, NVCC 編譯器行為已更改為確定性。例如,考慮這個測試用例:

//--
static __device__ void foo() { }

auto __device__ fptr = foo;

int main() { }
//--

在 CUDA 11 . 4 中,兩次編譯同一程序會在 PTX 中生成稍微不同的名稱:

//--
$cuda-11.4/bin/nvcc -std=c++14 -rdc=true -ptx test.cu -o test1.ptx
$cuda-11.4/bin/nvcc -std=c++14 -rdc=true -ptx test.cu -o test2.ptx
$diff -w test1.ptx test2.ptx
13c13
< .func _ZN57_INTERNAL_39_tmpxft_00000a46_00000000_7_test_cpp1_ii_main3fooEv
---
> .func _ZN57_INTERNAL_39_tmpxft_00000a4e_00000000_7_test_cpp1_ii_main3fooEv
16c16
< .visible .global .align 8 .u64 fptr = _ZN57_INTERNAL_39_tmpxft_00000a46_00000000_7_test_cpp1_ii_main3fooEv;
---
> .visible .global .align 8 .u64 fptr = _ZN57_INTERNAL_39_tmpxft_00000a4e_00000000_7_test_cpp1_ii_main3fooEv;
18c18
< .func _ZN57_INTERNAL_39_tmpxft_00000a46_00000000_7_test_cpp1_ii_main3fooEv()
---
> .func _ZN57_INTERNAL_39_tmpxft_00000a4e_00000000_7_test_cpp1_ii_main3fooEv()
$
//--

使用 CUDA 11 . 5 ,兩次編譯同一程序會生成相同的 PTX :

//--
$nvcc -std=c++14 -rdc=true -ptx test.cu -o test1.ptx
$nvcc -std=c++14 -rdc=true -ptx test.cu -o test2.ptx                     	 
$diff -w test1.ptx test2.ptx
$
//--

結論

通過閱讀在 CUDA 11 . 5 工具包中展示新功能文章,了解更多關于 CUDA 11 . 5 工具包的信息。

關于作者

Arthy Sundaram 是 CUDA 平臺的技術產品經理。她擁有哥倫比亞大學計算機科學碩士學位。她感興趣的領域是操作系統、編譯器和計算機體系結構。

Jaydeep Marathe 是 NVIDIA 的高級編譯工程師。他擁有北卡羅來納州立大學計算機科學碩士和博士學位。

Hari Sandanagobalane 是 NVIDIA 的高級編譯工程師。他擁有新加坡國立大學計算機科學碩士學位。

Mike Murphy 是 NVIDIA 的高級編譯工程師。

Xiaohua Zhang 是 NVIDIA 的高級編譯工程師。他擁有清華大學計算機科學碩士學位。

Girish Bharambe 是 NVIDIA 的高級編譯經理。他擁有印度浦那大學計算機工程學士學位。

審核編輯:郭婷

聲明:本文內容及配圖由入駐作者撰寫或者入駐合作網站授權轉載。文章觀點僅代表作者本人,不代表電子發燒友網立場。文章及其配圖僅供工程師學習之用,如有內容侵權或者其他違規問題,請聯系本站處理。 舉報投訴
  • NVIDIA
    +關注

    關注

    14

    文章

    4978

    瀏覽量

    102988
  • 代碼
    +關注

    關注

    30

    文章

    4779

    瀏覽量

    68524
收藏 人收藏

    評論

    相關推薦

    HighTec C/C++編譯器支持Andes晶心科技RISC-V IP

    汽車編譯器解決方案領先供貨商HighTec EDV-Systeme GmbH宣布其針對汽車市場的高度優化C/C++編譯器支持Andes晶心科技的RISC-V IP。這項支持對汽車軟件開
    的頭像 發表于 12-12 16:26 ?186次閱讀

    MSP430優化C/C++編譯器v21.6.0.LTS

    電子發燒友網站提供《MSP430優化C/C++編譯器v21.6.0.LTS.pdf》資料免費下載
    發表于 11-08 14:57 ?0次下載
    MSP430優化<b class='flag-5'>C</b>/<b class='flag-5'>C</b>++<b class='flag-5'>編譯器</b>v21.6.0.LTS

    ARM優化C/C++編譯器 v20.2.0.LTS

    電子發燒友網站提供《ARM優化C/C++編譯器 v20.2.0.LTS.pdf》資料免費下載
    發表于 11-07 10:46 ?0次下載
    ARM優化<b class='flag-5'>C</b>/<b class='flag-5'>C</b>++<b class='flag-5'>編譯器</b> v20.2.0.LTS

    TMS320C6000優化C/C++編譯器v8.3.x

    電子發燒友網站提供《TMS320C6000優化C/C++編譯器v8.3.x.pdf》資料免費下載
    發表于 11-01 09:35 ?0次下載
    TMS320<b class='flag-5'>C</b>6000優化<b class='flag-5'>C</b>/<b class='flag-5'>C</b>++<b class='flag-5'>編譯器</b>v8.3.x

    TMS320C28x優化C/C++編譯器v22.6.0.LTS

    電子發燒友網站提供《TMS320C28x優化C/C++編譯器v22.6.0.LTS.pdf》資料免費下載
    發表于 10-31 10:10 ?0次下載
    TMS320<b class='flag-5'>C</b>28x優化<b class='flag-5'>C</b>/<b class='flag-5'>C</b>++<b class='flag-5'>編譯器</b>v22.6.0.LTS

    C7000優化C/C++編譯器

    電子發燒友網站提供《C7000優化C/C++編譯器.pdf》資料免費下載
    發表于 10-30 09:45 ?0次下載
    <b class='flag-5'>C</b>7000優化<b class='flag-5'>C</b>/<b class='flag-5'>C</b>++<b class='flag-5'>編譯器</b>

    Keil編譯器優化方法

    我們都知道,代碼是可以通過編譯器優化的,有的時候,為了提高運行速度或者減少代碼尺寸,會開啟優化選項。
    的頭像 發表于 10-23 16:35 ?505次閱讀
    Keil<b class='flag-5'>編譯器</b>優化方法

    AI編譯器技術剖析

    隨著人工智能技術的飛速發展,AI編譯器作為一種新興的編譯技術逐漸進入人們的視野。AI編譯器不僅具備傳統編譯器的功能,如將高級語言編寫的源代碼轉換為機器可執行的代碼,還融入了人工智能技術
    的頭像 發表于 07-17 18:28 ?1616次閱讀

    人工智能編譯器與傳統編譯器的區別

    人工智能編譯器(AI編譯器)與傳統編譯器在多個方面存在顯著的差異。這些差異主要體現在設計目標、功能特性、優化策略、適用范圍以及技術復雜性等方面。以下是對兩者區別的詳細探討,旨在全面解析
    的頭像 發表于 07-17 18:19 ?1834次閱讀

    Meta發布基于Code Llama的LLM編譯器

    近日,科技巨頭Meta在其X平臺上正式宣布推出了一款革命性的LLM編譯器,這一模型家族基于Meta Code Llama構建,并融合了先進的代碼優化和編譯器功能。LLM編譯器的推出,標志著Meta在人工智能領域的又一重大突破,將
    的頭像 發表于 06-29 17:54 ?1489次閱讀

    SEGGER編譯器優化和安全技術介紹 支持最新CC++語言

    SEGGER編譯器是專門為ARM和RISC-V微控制設計的優化C/C++編譯器。它建立在強大的Clang前端上,支持最新的
    的頭像 發表于 06-04 15:31 ?1443次閱讀
    SEGGER<b class='flag-5'>編譯器</b>優化和安全技術介紹 支持最新<b class='flag-5'>C</b>和<b class='flag-5'>C</b>++語言

    C語言:嵌入式開發中的關鍵編譯器角色

    嵌入式程序開發跟硬件密切相關,需要使用C語言來讀寫底層寄存、存取數據、控制硬件等,C語言和硬件之間由編譯器來聯系,一些C標準不支持的硬件
    發表于 04-26 14:53 ?610次閱讀
    <b class='flag-5'>C</b>語言:嵌入式開發中的關鍵<b class='flag-5'>編譯器</b>角色

    QT開發學習筆記1(安裝交叉編譯器

    QT安裝交叉編譯器
    的頭像 發表于 02-18 10:02 ?925次閱讀
    QT開發學習筆記1(安裝交叉<b class='flag-5'>編譯器</b>)

    RX系列V3.06.00的C/C++編譯器包數據手冊

    電子發燒友網站提供《RX系列V3.06.00的C/C++編譯器包數據手冊.pdf》資料免費下載
    發表于 01-26 15:57 ?1次下載
    RX系列V3.06.00的<b class='flag-5'>C</b>/<b class='flag-5'>C</b>++<b class='flag-5'>編譯器</b>包數據手冊

    RL78系列的C編譯器包數據手冊

    電子發燒友網站提供《RL78系列的C編譯器包數據手冊.pdf》資料免費下載
    發表于 01-26 15:55 ?1次下載
    RL78系列的<b class='flag-5'>C</b><b class='flag-5'>編譯器</b>包數據手冊
    主站蜘蛛池模板: 王雨纯羞羞| 亚洲AV精品一区二区三区不卡| 婬香婬色天天视频| 国产日韩精品SUV| 亚洲成人在线免费观看| 国语自产一区视频| 最新国产在线视频在线| 免费在线视频一区| 白洁在线观看| 四虎永久在线精品免费A| 国产制服丝袜91在线| 中文天堂www资源| 日本理伦片午夜理伦片| 国产欧美二区综合| 在线观看日本污污ww网站| 欧美亚洲国产免费高清视频| 高清撒尿hdtube撒尿| 亚洲欧美人成视频在线| 殴美黄色网| 久久久久九九| 动漫在线观看免费肉肉| 一区二区中文字幕在线观看| 日本乱hd高清videos| 九色PORNY蝌蚪视频首页| 国产 高清 无码 在线播放| 亚洲乱码国产乱码精品精98 | 美妇教师双飞后菊| 国产精品伦理一二三区伦理| 最近的中文字幕2019国语| 玩弄人妻少妇500系列网址| 免费乱理伦片在线观看八戒| 国产伦精品一区二区免费| 成年人免费观看的视频| 越南美女内射BBWXZ| 亚洲欧美一区二区三区九九九| 日韩亚洲视频一区二区三区| 蕾丝边娱乐网| 久9青青cao精品视频在线| 国产午夜免费不卡精品理论片| xxxx69日本| 办公室里呻吟的丰满老师电影|