亚洲精品久久久久久久久久久,亚洲国产精品一区二区制服,亚洲精品午夜精品,国产成人精品综合在线观看,最近2019中文字幕一页二页

0
  • 聊天消息
  • 系統(tǒng)消息
  • 評(píng)論與回復(fù)
登錄后你可以
  • 下載海量資料
  • 學(xué)習(xí)在線課程
  • 觀看技術(shù)視頻
  • 寫(xiě)文章/發(fā)帖/加入社區(qū)
會(huì)員中心
創(chuàng)作中心

完善資料讓更多小伙伴認(rèn)識(shí)你,還能領(lǐng)取20積分哦,立即完善>

3天內(nèi)不再提示

教程:把TensorCores帶到標(biāo)準(zhǔn)Fortran

電子設(shè)計(jì) ? 來(lái)源:電子設(shè)計(jì) ? 作者:電子設(shè)計(jì) ? 2020-10-21 20:02 ? 次閱讀
加入交流群
微信小助手二維碼

掃碼添加小助手

加入工程師交流群

調(diào)優(yōu)數(shù)學(xué)庫(kù)是從HPC系統(tǒng)中提取最終性能的一種簡(jiǎn)單而可靠的方法。 然而,對(duì)于長(zhǎng)期存在的應(yīng)用程序或需要在各種平臺(tái)上運(yùn)行的應(yīng)用程序來(lái)說(shuō),為每個(gè)供應(yīng)商或庫(kù)版本調(diào)整庫(kù)調(diào)用可能是一個(gè)維護(hù)噩夢(mèng)。

一個(gè)編譯器可以自動(dòng)生成對(duì)調(diào)優(yōu)的數(shù)學(xué)庫(kù)的調(diào)用,這給您提供了兩個(gè)世界中最好的:易于移植和最終性能。 在這篇文章中,我展示了如何無(wú)縫地加速GPU上的許多標(biāo)準(zhǔn)Fortran數(shù)組intrinsic和語(yǔ)言構(gòu)造。 nvfortran編譯器通過(guò)將Fortran語(yǔ)句映射到NVIDIA cu TEN SOR庫(kù)中可用的函數(shù)來(lái)自動(dòng)實(shí)現(xiàn)這種加速,這是一種第一種GPU加速的張量線性代數(shù)庫(kù),提供張量收縮、約簡(jiǎn)和元素操作。

一個(gè)簡(jiǎn)單的上車(chē)到NVIDIA GPU

下面是標(biāo)準(zhǔn)Fortran數(shù)組內(nèi)在函數(shù)如何映射到GPU加速的數(shù)學(xué)庫(kù)。 在最簡(jiǎn)單的層次上,只需要兩個(gè)Fortran語(yǔ)句就可以利用cut TEN SOR庫(kù)提供的出色性能:

use  卡頓索克斯
...
c = matmul(a,b)

使用的第一個(gè)語(yǔ)句 卡頓索克斯 預(yù)定義模塊以重載Fortran內(nèi)部過(guò)程、數(shù)組表達(dá)式和重載賦值的形式包含cuTENSOR庫(kù)的接口。這些接口僅用于映射位于GPU設(shè)備內(nèi)存中的陣列。在本文后面,我將從OpenACC和CUDA Fortran程序員的角度討論這意味著什么。定義了這些接口后,第二條語(yǔ)句包含 馬修() 內(nèi)在調(diào)用自動(dòng)映射到cuTEN SOR函數(shù)調(diào)用。

接口通過(guò)識(shí)別和匹配幾種常用模式來(lái)實(shí)現(xiàn)延遲執(zhí)行,這些模式可以映射到單個(gè)cu TEN SOR內(nèi)核調(diào)用。 在所有情況下,調(diào)用多個(gè)cu TEN SOR函數(shù)來(lái)設(shè)置cu TEN SOR所需的句柄、描述符數(shù)據(jù)結(jié)構(gòu)和工作緩沖區(qū)。

然而,只有一個(gè)內(nèi)核被啟動(dòng)到GPU上。 由于性能原因,必須映射整個(gè)語(yǔ)句,包括左側(cè)數(shù)組的賦值。 您不希望編譯器為右側(cè)操作的輸入或結(jié)果(中間或最終)創(chuàng)建臨時(shí)數(shù)組,這在Fortran中很常見(jiàn)。

支持標(biāo)準(zhǔn)Fortran操作

cut TEN SOR庫(kù)包含一般的置換和收縮操作。 置換的結(jié)果可以選擇由元素函數(shù)操作,也可以選擇縮放。

nvfortran編譯器可以識(shí)別和映射各種Fortran轉(zhuǎn)換intrinsic和元素intrinsic函數(shù),這些函數(shù)與通用數(shù)組語(yǔ)法相結(jié)合,用于cut TEN SOR功能。 一些比較直接的翻譯包括以下內(nèi)容:

d = transpose(a)
d = func(transpose(a))
d = alpha * func(transpose(a)

d = reshape(a,shape=[...])
d = reshape(a,shape=[...],order=[...])
d = func(reshape(a,...))
d = alpha * func(reshape(a,...))

d = spread(a,dim=k,ncopies=n)
d = func(spread(a,dim=k,ncopies=n))
d = alpha * func(spread(a,dim=k,ncopies=n))

的投入 馬修() 也可以在CuTEN SOR中置換,結(jié)果可以縮放和累積。 這導(dǎo)致了幾種可能的組合,例如以下陳述:

c = matmul(a,b)
c = c + matmul(a,b)
c = c - matmul(a,b)
c = c + alpha * matmul(a,b)
d = alpha * matmul(a,b) + beta * c

c = matmul(transpose(a),b)
c = matmul(reshape(a,shape=[...],order=[...]),b)
c = matmul(a,transpose(b))
c = matmul(a,reshape(b,shape=[...],order=[...]))

使用來(lái)自標(biāo)準(zhǔn)Fortran的NVIDIA TensorCores

利用cuTEN SOR和NVIDIA TensorCores可以像下面的代碼示例一樣容易,當(dāng)您使用包含在其中的隨機(jī)數(shù)生成特性時(shí) 卡頓索克斯 模塊:

program main
 use  卡頓索克斯
 integer, parameter :: ni=5120, nj=5120, nk=5120, ntimes=10
  真實(shí)的(8), allocatable, dimension(:,:) :: a, b, d
 allocate(a(ni,nk),b(nk,nj),d(ni,nj))
 call random_number(a)
 call random_number(b)
 d = 0.0d0

 print *,"cutensor"
 call cpu_time(t1)
 do nt = 1, ntimes
 d = d + matmul(a,b)
 end do
 call cpu_time(t2)

 flops = 2.0*ni*nj*nk
 flops = flops*ntimes
 print *,"times",t2,t1,t2-t1
 print *,"GFlops",flops/(t2-t1)/1.e9
 end program

The 馬修() 內(nèi)在調(diào)用映射到cuTENSOR調(diào)用,在可能的情況下無(wú)縫地使用Tensor Cores。我將在本文后面展示一些性能結(jié)果。

用nvfortran編譯程序

你可能會(huì)問(wèn)這個(gè)程序是如何使用cuTEN SOR的,當(dāng)我早些時(shí)候說(shuō)的 cutensorex 接口只將GPU設(shè)備陣列上的操作映射到CuTEN SOR調(diào)用。 答案在于程序是如何編譯的:

% nvfortran -acc -gpu=managed -cuda -cudalib main.f90

在這里,我將程序編譯為Open ACC程序,并利用OpenACC管理內(nèi)存模式,其中所有可分配數(shù)組都在CUDA統(tǒng)一內(nèi)存中分配。 加上了 -cuda 這也支持CUDAFortran擴(kuò)展,數(shù)組本質(zhì)上是CUDAFortran– 托管數(shù)組。 CUDA Fortran通用接口匹配的一個(gè)規(guī)則是,當(dāng)主機(jī)和設(shè)備接口都存在時(shí),對(duì)于托管的實(shí)際參數(shù)更喜歡設(shè)備接口。

當(dāng)聲明、分配和使用在同一個(gè)程序單元中時(shí),nvfortran編譯器提供了一些快捷方式。 一般來(lái)說(shuō),最好使用OpenACC指令來(lái)指示編譯器傳遞設(shè)備地址,如下面的代碼示例:

!$acc host_data use_device(a, b, d)
 do nt = 1, ntimes
 d = d + matmul(a,b)
 end do
!$acc end host_data

在這種情況下 -cuda 不需要編譯器選項(xiàng)。

使用CUDAFortran的CuTEN SOR

對(duì)于CUDAFortran用戶(hù),the cutensorex 模塊和Fortran轉(zhuǎn)換本質(zhì)成為高性能和完全可移植代碼的快速路徑。 使用這個(gè) !@cuf 哨兵添加由nvfortranCUDAFortran編譯器解釋和編譯的代碼行,或被標(biāo)準(zhǔn)Fortran編譯器忽略為注釋?zhuān)?/p>

 program main
!@cuf use cutensorex
!@cuf use cudafor
 integer, parameter :: ni=5120, nj=5120, nk=5120, ntimes=10
 real(8), allocatable, dimension(:,:) :: a, b, d
!@cuf attributes(device) :: a, b, d
 allocate(a(ni,nk),b(nk,nj),d(ni,nj))
 call random_number(a)
 call random_number(b)
 d = 0.0d0

 print *,"cutensor"
 call cpu_time(t1)
 do nt = 1, ntimes
 d = d + matmul(a,b)
 end do
 call cpu_time(t2)

 flops = 2.0*ni*nj*nk
 flops = flops*ntimes
 print *,"times",t2,t1,t2-t1
 print *,"GFlops",flops/(t2-t1)/1.e9
 end program

在第6行,我用設(shè)備屬性聲明了數(shù)組,它將它們放在GPU設(shè)備內(nèi)存中。 但是,它們也可以用托管屬性來(lái)聲明。 本程序可編譯并鏈接如下命令:

% nvfortran -Mcudalib main.cuf

在真實(shí)(8)數(shù)據(jù)上測(cè)量的性能

下面是性能,從前面示例中使用的真實(shí)(8)(雙精度)數(shù)據(jù)開(kāi)始。 你可以用幾種方式來(lái)衡量矩陣乘性能:

單線程CPU實(shí)現(xiàn)

多線程或多核CPU實(shí)現(xiàn)

樸素編碼矩陣乘用指令卸載

The 馬修() 內(nèi)在映射到CuTEN SOR

To get the best threaded-CPU performance, use the basic linear algebra subprogram (BLAS) library routine DGEMM. The equivalent DGEMM call to the earlier operation is the following command:

call dgemm('n','n',ni,nj,nk,1.0d0,a,ni,b,nk,1.0d0,d,ni)

為了了解調(diào)優(yōu)庫(kù)在天真的實(shí)現(xiàn)中可以提供什么,請(qǐng)使用下面的Open ACC循環(huán)結(jié)構(gòu)在GPU上運(yùn)行。 回路結(jié)構(gòu)采用無(wú)特殊平鋪或硬件指令。

!$acc kernels
 do j = 1, nj
 do i = 1, ni
 do k = 1, nk
 d(i,j) = d(i,j) + a(i,k) * b(k,j)
 end do
 end do
 end do
!$acc end kernels

實(shí)施/處理器 TFLOP
NVFORTRAN單CPU核上的Matmul 0.010
在64個(gè)CPU核心上的MKLDGEMM 1.674
天真開(kāi)放ACC在V100 0.235
天真開(kāi)放ACC在A100 0.447
NVFORTRAN Matmul on V100 6.866
A100上的NVFORTRAN Matmul 一十七點(diǎn)六六

您不僅得到自動(dòng)GPU加速在V100和A100GPU使用 馬修() 內(nèi)在的,但在A100上的映射 馬修() 對(duì)于cuTensor調(diào)用,您可以自動(dòng)使用FP64TensorCores。

在真實(shí)(4)和真實(shí)(2)數(shù)據(jù)上測(cè)量的性能

您可以使用相同的運(yùn)行集執(zhí)行 真實(shí)的(4) (單一精度)數(shù)據(jù)和調(diào)用SGEMM而不是DGEMM。 此外,CUDA11.0cut Tensor Fortran包裝器可以利用A100TF32數(shù)據(jù)類(lèi)型和TensorCores。 表2顯示了這些運(yùn)行的性能。

實(shí)施/處理器 TFLOP
NVFORTRAN單CPU核上的Matmul 0.025
在64個(gè)CPU核心上的MKLSGEMM 3.017
天真開(kāi)放ACC在V100 0.460
天真開(kāi)放ACC在A100 0.946
NVFORTRAN Matmul on V100 一十點(diǎn)七零六
A100上的NVFORTRAN Matmul 一十四點(diǎn)六二一
NVFORTRAN Matmul on A100 using TF32 六十點(diǎn)三五八


為什么停在那里? nvfortran編譯器支持16位浮點(diǎn)格式(FP16 真實(shí)的(2) 數(shù)據(jù)類(lèi)型。 您可以在前面的測(cè)試中更改數(shù)組的類(lèi)型,并在半精度上運(yùn)行時(shí)間。

在V100上引入了半精度數(shù)據(jù)的TensorCore操作,然后在A100GPU上擴(kuò)展,以支持TF32和全雙精度DP64TensorCores。 而nvfortran支持 真實(shí)的(2) 而TensorCores在V100和A100上,它不支持完整和優(yōu)化 真實(shí)的(2) 在CPU上,標(biāo)準(zhǔn)的BLAS庫(kù)也沒(méi)有。 在這種情況下,比較GPU加速版本的性能是有意義的(表3)。

實(shí)施/處理器 TFLOP
天真開(kāi)放ACC在V100 0.490
天真開(kāi)放ACC在A100 2.058
NVFORTRAN Matmul on V100 六十八點(diǎn)二四二
A100上的NVFORTRAN Matmul 九十二點(diǎn)八一


雖然A100的性能令人印象深刻,代碼是完全可移植的,但對(duì)于TF32和FP16來(lái)說(shuō),它明顯低于峰值。 有固定的開(kāi)銷(xiāo):在每次調(diào)用時(shí),創(chuàng)建和銷(xiāo)毀cutTEN SOR張量描述符并創(chuàng)建收縮計(jì)劃。 您還必須查詢(xún)和管理收縮中使用的工作區(qū)需求,這最終可能會(huì)調(diào)用 古達(dá)·馬洛克 and 無(wú)庫(kù)達(dá) 。 如果開(kāi)銷(xiāo)是5– 對(duì)于FP64,這變得更接近25%的TF32和大約35%的FP16,對(duì)于這個(gè)大小的問(wèn)題。

對(duì)于需要最終性能的開(kāi)發(fā)人員,nvfortran確實(shí)直接支持Fortran接口到FortranCutensor模塊中的CcuTEN SORAPI,也是在HPCSDK中提供的。 您可以自己管理張量描述符、計(jì)劃和工作區(qū)。

結(jié)局推論

在這篇文章中,我展示了一些簡(jiǎn)單的程序和Fortran intrinsic調(diào)用的類(lèi)型以及可以在GPU上自動(dòng)加速的代碼模式。 他們甚至可以通過(guò)cuTEN SOR自動(dòng)利用TensorCores。 使用幾乎完全標(biāo)準(zhǔn)的Fortran和完全可移植到其他編譯器和系統(tǒng)的程序,您可以在NVIDIA GPU上實(shí)現(xiàn)矩陣乘法、矩陣轉(zhuǎn)置、元素?cái)?shù)組本質(zhì)和數(shù)組語(yǔ)法的多個(gè)組合上的近峰性能。

不可能預(yù)測(cè)你可以用這些新特性做些什么或?qū)崿F(xiàn)什么。 我期待著看到你的反饋和結(jié)果。 NVIDIA繼續(xù)添加更多的特性,允許您使用標(biāo)準(zhǔn)Fortran結(jié)構(gòu)以最大性能編程NVIDIA GPU。

關(guān)于作者

關(guān)于布倫特·萊克
Brent Leback管理NVIDIA HPC編譯器客戶(hù)支持和高級(jí)服務(wù),并與HPC社區(qū)一起移植和優(yōu)化GPU計(jì)算應(yīng)用程序。 他是CUDAFortran編程語(yǔ)言的共同創(chuàng)造者,并繼續(xù)積極參與新的CUDAFortran功能的設(shè)計(jì)。 他是開(kāi)放ACC GPU黑客馬拉松的??停彩荂UDA Fortran的專(zhuān)家。


審核編輯 黃昊宇

聲明:本文內(nèi)容及配圖由入駐作者撰寫(xiě)或者入駐合作網(wǎng)站授權(quán)轉(zhuǎn)載。文章觀點(diǎn)僅代表作者本人,不代表電子發(fā)燒友網(wǎng)立場(chǎng)。文章及其配圖僅供工程師學(xué)習(xí)之用,如有內(nèi)容侵權(quán)或者其他違規(guī)問(wèn)題,請(qǐng)聯(lián)系本站處理。 舉報(bào)投訴
收藏 人收藏
加入交流群
微信小助手二維碼

掃碼添加小助手

加入工程師交流群

    評(píng)論

    相關(guān)推薦
    熱點(diǎn)推薦

    求Labview 下調(diào)用Fortran dll的詳細(xì)教程

    各位好,我現(xiàn)在用到LabVIEW下調(diào)用Fortran dll的問(wèn)題,調(diào)用老是出問(wèn)題,請(qǐng)問(wèn)有用過(guò)的嗎?能不能給個(gè)詳細(xì)的教程
    發(fā)表于 09-28 16:52

    Fortran

    Fortran中存在內(nèi)置的復(fù)數(shù)類(lèi)型么?auto 關(guān)鍵字有什么作用?strcmp()函數(shù)用于比較兩個(gè)字符串,他存在什么問(wèn)題?
    發(fā)表于 12-15 18:38

    時(shí)間域控制系統(tǒng)分析及拉普拉斯變換Fortran程序解答

    Fortran語(yǔ)言編程實(shí)現(xiàn)。內(nèi)容附圖符合國(guó)際標(biāo)準(zhǔn)經(jīng)控制系統(tǒng)的分析,提高了控制系統(tǒng)的穩(wěn)定性,改善了頻率響應(yīng)!粵港澳大灣區(qū) 2020-8-13
    發(fā)表于 08-13 19:45

    Arm Fortran編譯器開(kāi)發(fā)人員和參考指南

    )工作負(fù)載量身定制。Arm?Fortran編譯器支持流行的Fortran和OpenMP標(biāo)準(zhǔn),并針對(duì)基于Arm?v8-A的處理器進(jìn)行了調(diào)整。
    發(fā)表于 08-10 07:11

    Arm Fortran編譯器22.1版開(kāi)發(fā)人員和參考指南

    (HPC)工作負(fù)載量身定做。 ARM?Fortran編譯器支持流行的Fortran和OpenMP標(biāo)準(zhǔn),并針對(duì)基于ARM?V8-A的處理器進(jìn)行了調(diào)整。
    發(fā)表于 08-11 06:51

    Fortran函數(shù)大全

    Fortran 庫(kù)參考》介紹了 Sun™ Studio Fortran 庫(kù)中的內(nèi)部函數(shù)和例程。該參考手冊(cè)適用于具有 Fortran 語(yǔ)言和 Solaris™ 操作環(huán)境使用經(jīng)驗(yàn)的編程人員。該指南適用于具有
    發(fā)表于 11-04 16:52 ?0次下載

    Fortran常用算法程序集

    FORTRAN程序合集,包括積分、矩陣運(yùn)算、方程組求解、數(shù)據(jù)處理等
    發(fā)表于 09-07 16:01 ?3次下載

    獲得英特爾Fortran編譯器的支持

    Steve Lionel, Dr Fortran, covers the various ways that users of Intel Fortran compiler can get support including Premier support, forums
    的頭像 發(fā)表于 10-23 06:38 ?2212次閱讀

    FORTRAN教程Fortran語(yǔ)言程序設(shè)計(jì)詳細(xì)課件資料免費(fèi)下載

    本文檔的主要內(nèi)容詳細(xì)介紹的是FORTRAN教程FORTRAN語(yǔ)言程序設(shè)計(jì)詳細(xì)課件資料免費(fèi)下載。
    發(fā)表于 09-05 14:26 ?0次下載
    <b class='flag-5'>FORTRAN</b>教程<b class='flag-5'>Fortran</b>語(yǔ)言程序設(shè)計(jì)詳細(xì)課件資料免費(fèi)下載

    使用英特爾Visual Fortran編譯器

    Getting end user familiar with the Intel? Visual Fortran.
    的頭像 發(fā)表于 09-21 04:16 ?4441次閱讀

    介紹Fortran博士

    史蒂夫萊昂內(nèi)爾,Fortran博士,介紹了他參與Fortran的簡(jiǎn)短歷史,以及他如何贏得“Fortran博士”這個(gè)名字。
    的頭像 發(fā)表于 11-06 06:51 ?2088次閱讀

    英特爾Fortran編譯器支持編寫(xiě)并行代碼

    Fortran博士Steve Lionel談到了在英特爾Fortran編譯器中編寫(xiě)并行代碼的內(nèi)置支持,包括OpenMP 4.0,矢量化和線程。
    的頭像 發(fā)表于 11-06 06:43 ?3011次閱讀

    探討英特爾Fortran編譯器對(duì)Fortran標(biāo)準(zhǔn)的支持

    史蒂夫萊昂內(nèi)爾,Fortran博士,談?wù)撚⑻貭?b class='flag-5'>Fortran編譯器對(duì)Fortran標(biāo)準(zhǔn)的支持。具體來(lái)說(shuō),討論了Fortran 2003和20
    的頭像 發(fā)表于 11-06 06:40 ?4161次閱讀

    畢昇Fortran編譯器內(nèi)聯(lián)動(dòng)態(tài)庫(kù)函數(shù)str_copy

    畢昇Fortran編譯器是一款基于classic flang的高性能Fortran編譯器,支持Fortran編程語(yǔ)言的編譯和運(yùn)行,提供強(qiáng)大的數(shù)值計(jì)算和數(shù)據(jù)處理能力,在科學(xué)計(jì)算領(lǐng)域應(yīng)用前景廣闊。
    的頭像 發(fā)表于 09-21 11:35 ?1730次閱讀

    fortran 算法匯編

    電子發(fā)燒友網(wǎng)站提供《fortran 算法匯編.rar》資料免費(fèi)下載
    發(fā)表于 01-07 09:55 ?0次下載