GCC 6.1 Release Note 重點翻譯(下)

下集主要是語言跟作業系統相關的改善項目,Skymizer 翻譯了大家可能會比較關心的部份。也歡迎所有朋友能夠一起補完與指正!

新語言與特定語言改善項目

相較於 GCC 5,GCC 6 包含了許多在 OpenACC 2.0a 規格上的改進。
下面是一些主要的重點列舉:

  • 除了單一執行緒的 host-fallback execution,亦支援 offloading 在 x86_64 上的 nvptx (Nvidia GPUs)
    與 64 位元的 PowerPC (little-endian, GNU/Linux host systems)。
    對於 nvptx 的 offloading,在 parallel construct 上,
    其 execution model 允許任意數量的 gangs,最高達 32 workers 和 32 vectors.

  • 初步支援 OpenACC kernel constructs 的平行化執行:

    • Kernels region 的平行化可透過 -O2 以上搭配 -fopenacc 來開啟。
    • Code 可被 offloaded 到多個 gangs 上,但只能在一個 worker 上執行,且 vector length 為 1。
    • 不支援在 kernels region 中使用 directives。
    • 簡化的迴圈可被平行化。
    • 只有一個巢狀迴圈的 kernels regions 可被平行化。
    • 巢狀迴圈只有最外層的迴圈可以被平行化。
    • 包含 sibling loops 的巢狀迴圈不可被平行化。

    一般而言,使用 OpenACC parallel construct 會比初步支援的 OpenACC kernels construct 有更好的效能。

  • device_type, bind, nohost clauses 並不支援。而在 Fortran 下,host_data directive 也不支援。

  • 不支援 nested parallelism (cf. CUDA dynamic parallelism)。

  • 不支援在 multithreaded contexts (例如pthread programming, OpenMP) 內使用 OpenACC constructs。

  • 在呼叫 acc_on_device 時若有編譯時期的常數參數,其 function call 亦可 evaluate 為編譯時期的常數結果。
    此改善只在 C 和 C++ 中支援,Fortran 不支援。

請參考 OpenACC 和 Offloading wiki 頁面以取得更多資訊。

C family
  • OpenMP specification 4.5 現在 C 與 C++ 編譯器都可支援。

  • C 與 C++ 編譯器現在能夠支援 enumerators 上的屬性。
    例如現在可以標記某個 enum 的變數為 deprecated 屬性,如下所示:

    enum {
     newval,
     oldval __attribute__ ((deprecated ("too old")))
    };
  • C 與 C++ 編譯器的能夠以一個範圍而非用單一點來追蹤程式碼中的錯誤位置。
    如此可較易於識別出複雜的運算式中較需要注意的子運算式。
  test.cc: In function 'int test(int, int, foo, int, int)':
  test.cc:5:16: error: no match for 'operator*' (operand types are 'int' and 'foo')
     return p + q * r * s + t;
                ~\~^~~

此外,現在初步支援在字串中能夠以精確的位置發出問題警告

    format-strings.c:3:14: warning: field width specifier '*' expects a matching 'int' argument [-Wformat=]
    printf(“%*d");
             ^
  • 在問題診斷上現在擁有 fix-it hints(會呈現在相關的程式碼下方),例如:
    fixits.c: In function 'bad_deref':
    fixits.c:11:13: error: 'ptr' is a pointer; did you mean to use '->'?
       return ptr.x;
                 ^
                 ->
  • C 與 C++ 編譯器現在可以對拼錯的 field name 提供修正建議:
  spellcheck-fields.cc:52:13: error: 'struct s' has no member named 'colour'; did you mean 'color'?
      return ptr->colour;
  • 新增 C 與 C++ 編譯器的命令列 options:
    • -Wshift-negative-value 會對向左 shift 負值發出警告。
    • -Wshift-overflow 會預設對向左 shift 溢位發出警告,而 -Wshift-overflow=2 則是對左移 1 到 sign bit 發出警告。
    • -Wtautological-compare 會對 self-comparison 被判斷為總是 true 或 false 時發出警告。-Wall 會啟用此項警告。
    • -Wnull-dereference 會在編譯器偵測到 paths 中存在著錯誤或是
      因為 dereferencing 一個 null pointer 這種 undefined behavior 時發出警告。
      此項 option 只有在 -fdelete-null-pointer-checks 也啟用的時候(在大部分的裝置上都會被啟動)才有作用。
      此項警告的準確度會受到優化 option 的使用情況所影響。
    • -Wduplicated-cond 會在當某條件判斷式在 if-else-if chain 中重複出現時發出警告。
    • -Wmisleading-indentation 會在使用者可讀性上有不恰當縮排行為時發出警告。
      以 CVE-2014-1266 為例:
    sslKeyExchange.c: In function 'SSLVerifySignedServerKeyExchange':
    sslKeyExchange.c:629:3: warning: this 'if' clause does not guard... [-Wmisleading-indentation]
        if ((err = SSLHashSHA1.update(&hashCtx, &signedParams)) != 0)
        ^~
    sslKeyExchange.c:631:5: note: ...this statement, but the latter is misleadingly indented as if it is guarded by the 'if'
            goto fail;
            ^~~~

-Wall 會啟用此項警告。

  • C 與 C++ 編譯器現在若遇到 merge-conflict markers 出現 在source file 時會較合理的顯示錯誤訊息。
C
  • 當以 designated initializers 來覆寫具有 side effect 的 struct 或 union 中的初始化 field 時,
    可以用新的 option -Woverride-init-side-effects 來取消警告。

  • 在 structure 跟 union 中,引進全新的屬性 scalar_storage_order。他可以指定在記憶體中 scalar fields 的 endianness。

C++
  • 預設語言標準更改至 -std=gnu++14。
  • C++ Concepts 現在利用 -fconcepts 選項來支援。
  • -flifetime-dse 會更積極地進行 dead code elimination 來處理當某個記憶體位置在 constructor 之前進行 store 的情況。
  • G++ 現在支援 C++17 fold expressions, u8 character literals, extended static_assert 和 nested namespace definitions。
  • G++ 現在允許對 non-type template arguments 進行 constant evaluation。
  • G++ 現在可以使用 -fgnu-tm 的選項來支援 C++ Transactional Memory
Runtime Library (libstdc++)
  • 感謝 Edward Smith-Rowland,使得現在可以延伸 C++ 函式庫來支援 mathematical special functions (ISO/IEC 29124:2010)
  • 感謝 Ville Voutilaninen的貢獻,得以嘗試支援 C++ 17,其中包含以下功能:
    • std::uncaught_exceptions (在 -std=gnu++NN 也適用)
      unique_key\ maps 的 新 member function try_emplace 和 insert_or_assign
    • 可以聯通 containers 和 arrays 的 non-member functions std::size, std::empty 和 std::data
    • std::invoke
    • std::shared_mutex
    • std::void_t 和 std::bool_constant
  • 在 the File System TS 進行測試。
  • 因為 Fan You 而開始測試支援大部分 Library Fundamentals TS 二版的功能。這之中包含 polymorphic memory resources 和 array support in shared_ptr。
  • 一些 Debug Mode 的 assertions 現在也可透過 _GLIBCXX_ASSERTIONS 被使用。透過新的 macro 來使用 subset of checks 會比 _GLIBCXX_DEBUG 減少 run-time,而且不會影響ABI函式庫,也因此可以啟用 per-translation unit。
  • Time mutex types 已經可以在更多裝置上運行,包括 Darwin。
  • 感謝 John Marion 和 Andreas Tobler, 讓我們得以改善 std::locale 對 DragonFly 和 FreeBSD 的支援。
Fortran
  • MATMUL intrinsic 現在在 front-end optimization的情況下會與 straightforward cases 相聯。而最大值可以透過開啟-finline-matmul-limit=n和關閉-finline-matmul-llimit=0設置n。
  • -Wconversion-extra 會提示關於REAL constants的部分。
  • 在-Wall裡預設新增 -Winteger-division,可以截短divisions of integer constants。
Operating System

Linux

  • 現在在 LinuxArch64, ARM, MicroBlaze, MIPS, MIPS64, PowerPC, PowerPC64, SH, i386, x32 和 x86_64 上支援 musl C library。如果 musl 並非預設的函式庫,則可以使用新的 -mmusl。

AIX

  • DWATF for AIX 7.1 除錯系統已經可以自由選用。但是會需要搭配較近期版本的Technology Level和GCC built才可以達到完整效果。

Window

  • 現在只要使用 SSE instructions,-mstackrealign option 就會自動在 32位元上被啟動。

相關文章:GCC 6 Release Note 重點翻譯(上)

發佈留言

發佈留言必須填寫的電子郵件地址不會公開。 必填欄位標示為 *