From 00c4b014392ebe36ee9b8d84cd606b976eeabd70 Mon Sep 17 00:00:00 2001 From: Andreas Herten Date: Tue, 8 Nov 2022 18:18:54 +0100 Subject: [PATCH] Update Alpaka symbol and add OpenMP to description --- compat.yml | 8 ++--- gpu-vendor-model-matrix.html | 45 +++++++++++++++-------------- gpu-vendor-model-matrix.pdf | Bin 25133 -> 25323 bytes gpu-vendor-model-matrix.svg | 2 +- gpu-vendor-model-matrix.table.html | 45 +++++++++++++++-------------- gpu-vendor-model-matrix.table.tex | 9 +++--- 6 files changed, 56 insertions(+), 53 deletions(-) diff --git a/compat.yml b/compat.yml index a05f589..c775528 100644 --- a/compat.yml +++ b/compat.yml @@ -158,7 +158,7 @@ vendors: nvidiakokkosfortran: somesupport ALPAKA: C: - intelalpakac: somesupport + intelalpakac: nonvendorok F: nvidiaalpakafortran: nope etc: @@ -181,7 +181,7 @@ descriptions: nvidiastandardfortran: 'Standard Language parallel features supported on NVIDIA GPUs through NVIDIA HPC SDK' nvidiakokkosc: 'Kokkos supports NVIDIA GPUs by calling CUDA as part of the compilation process' nvidiakokkosfortran: 'Kokkos is a C++ model, but an official compatibility layer (Fortran Language Compatibility Layer, FLCL) is available.' - nvidiaalpakac: 'Alpaka supports NVIDIA GPUs by calling CUDA as part of the compilation process' + nvidiaalpakac: 'Alpaka supports NVIDIA GPUs by calling CUDA as part of the compilation process; also, an OpenMP backend can be used' nvidiaalpakafortran: 'Alpaka is a C++ model' nvidiapython: 'There is a vast community of offloading Python code to NVIDIA GPUs, like CuPy, Numba, cuNumeric, and many others; NVIDIA actively supports a lot of them, but has no direct product like CUDA for Python; so, the status is somewhere in between' amdcudac: 'hipify by AMD can translate CUDA calls to HIP calls which runs natively on AMD GPUs' @@ -194,7 +194,7 @@ descriptions: amdopenmp: 'AMD offers a dedicated, Clang-based compiler for using OpenMP on AMD GPUs: AOMP; it supports both C/C++ (Clang) and Fortran (Flang, example)' amdstandard: 'Currently, no (known) way to launch Standard-based parallel algorithms on AMD GPUs' amdkokkosc: 'Kokkos supports AMD GPUs through HIP' - amdalpakac: 'Alpaka supports AMD GPUs through HIP' + amdalpakac: 'Alpaka supports AMD GPUs through HIP or through an OpenMP backend' amdpython: 'AMD does not officially support GPU programming with Python (also not semi-officially like NVIDIA), but third-party support is available, for example through Numba (currently inactive) or a HIP version of CuPy' intelcudac: "SYCLomatic translates CUDA code to SYCL code, allowing it to run on Intel GPUs; also, Intel's DPC++ Compatibility Tool can transform CUDA to SYCL" intelcudafortran: "No direct support, only via ISO C bindings, but at least an example can be found on GitHub; it's pretty scarce and not by Intel itself, though" @@ -206,5 +206,5 @@ descriptions: prettyok: "Intel supports pSTL algorithms through their DPC++ Library (oneDPL; GitHub). It's heavily namespaced and not yet on the same level as NVIDIA" intelstandardfortran: "With Intel oneAPI 2022.3, Intel supports DO CONCURRENT with GPU offloading" intelkokkosc: "Kokkos supports Intel GPUs through SYCL" - intelalpakac: "Alpaka v0.9.0 introduces experimental SYCL support" + intelalpakac: "Alpaka v0.9.0 introduces experimental SYCL support; also, Alpaka can use OpenMP backends" intelpython: "Not a lot of support available at the moment, but notably DPNP, a SYCL-based drop-in replacement for Numpy, and numba-dpex, an extension of Numba for DPC++." \ No newline at end of file diff --git a/gpu-vendor-model-matrix.html b/gpu-vendor-model-matrix.html index d481b96..07f137e 100644 --- a/gpu-vendor-model-matrix.html +++ b/gpu-vendor-model-matrix.html @@ -72,7 +72,7 @@ 3 - 4 + 4 5 @@ -112,7 +112,7 @@ 20 - 4 + 4 21 @@ -150,33 +150,33 @@ 31 - 4 + 32 - 32 + 33 6 - 33 + 34 - 33 + 34 - 34 + 35 - 34 + 35 - 35 + 36 - 36 + 37 - 37 + 38 14 - 38 + 39 16 - 39 + 40 @@ -184,7 +184,7 @@
  • 1: CUDA C/C++ is supported on NVIDIA GPUs through the CUDA Toolkit
  • 2: CUDA Fortran, a proprietary Fortran extension, is supported on NVIDIA GPUs via the NVIDIA HPC SDK
  • 3: HIP programs can directly use NVIDIA GPUs via a CUDA backend; HIP is maintained by AMD
  • -
  • 4: No such thing like HIP for Fortran
  • +
  • 4: No such thing like HIP for Fortran, but AMD offers Fortran interfaces to HIP and ROCm libraries in hipfort
  • 5: SYCL can be used on NVIDIA GPUs with experimental support either in SYCL directly or in DPC++, or via hipSYCL
  • 6: No such thing like SYCL for Fortran
  • 7: OpenACC C/C++ supported on NVIDIA GPUs directly (and best) through NVIDIA HPC SDK; additional, somewhat limited support by GCC C compiler and in LLVM through Clacc
  • @@ -212,14 +212,15 @@
  • 29: SYCLomatic translates CUDA code to SYCL code, allowing it to run on Intel GPUs; also, Intel's DPC++ Compatibility Tool can transform CUDA to SYCL
  • 30: No direct support, only via ISO C bindings, but at least an example can be found on GitHub; it's pretty scarce and not by Intel itself, though
  • 31: CHIP-SPV supports mapping CUDA and HIP to OpenCL and Intel's Level Zero, making it run on Intel GPUs
  • -
  • 32: SYCL is the prime programming model for Intel GPUs; actually, SYCL is only a standard, while Intel's implementation of it is called DPC++ (Data Parallel C++), which extends the SYCL standard in various places; actually actually, Intel namespaces everything oneAPI these days, so the full proper name is Intel oneAPI DPC++ (which incorporates a C++ compiler and also a library)
  • -
  • 33: OpenACC can be used on Intel GPUs by translating the code to OpenMP with Intel's Source-to-Source translator
  • -
  • 34: Intel has extensive support for OpenMP through their latest compilers
  • -
  • 35: Intel supports pSTL algorithms through their DPC++ Library (oneDPL; GitHub). It's heavily namespaced and not yet on the same level as NVIDIA
  • -
  • 36: With Intel oneAPI 2022.3, Intel supports DO CONCURRENT with GPU offloading
  • -
  • 37: Kokkos supports Intel GPUs through SYCL
  • -
  • 38: Alpaka v0.9.0 introduces experimental SYCL support
  • -
  • 39: Not a lot of support available at the moment, but notably DPNP, a SYCL-based drop-in replacement for Numpy, and numba-dpex, an extension of Numba for DPC++.
  • +
  • 32: No such thing like HIP for Fortran
  • +
  • 33: SYCL is the prime programming model for Intel GPUs; actually, SYCL is only a standard, while Intel's implementation of it is called DPC++ (Data Parallel C++), which extends the SYCL standard in various places; actually actually, Intel namespaces everything oneAPI these days, so the full proper name is Intel oneAPI DPC++ (which incorporates a C++ compiler and also a library)
  • +
  • 34: OpenACC can be used on Intel GPUs by translating the code to OpenMP with Intel's Source-to-Source translator
  • +
  • 35: Intel has extensive support for OpenMP through their latest compilers
  • +
  • 36: Intel supports pSTL algorithms through their DPC++ Library (oneDPL; GitHub). It's heavily namespaced and not yet on the same level as NVIDIA
  • +
  • 37: With Intel oneAPI 2022.3, Intel supports DO CONCURRENT with GPU offloading
  • +
  • 38: Kokkos supports Intel GPUs through SYCL
  • +
  • 39: Alpaka v0.9.0 introduces experimental SYCL support
  • +
  • 40: Not a lot of support available at the moment, but notably DPNP, a SYCL-based drop-in replacement for Numpy, and numba-dpex, an extension of Numba for DPC++.
  • diff --git a/gpu-vendor-model-matrix.pdf b/gpu-vendor-model-matrix.pdf index 744a543a0d2a15c46de65d5fc827909100adcd00..7daafe2c07dea3bf14b62c11fe95dd6effd5abc5 100644 GIT binary patch delta 16589 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 delta 16482 zcmZv@Q

    wlLgvcwr$(CZQHi3ugk9LvTfV8ZQHi1ZvS)d!`zw4z4Dy%5VUn^6^1AyEvH|+Cq7(U+Iq7 zQI92Uy{O-UW5js=0-?pSK;P9}Yhv#FD>A0nibY}n{_-)*V`fG&R2VrUl7v@eGVF8W zO|<{G5uVBLDJ~b0-MTlb;QaoIn*9mF4}jAnctrayM&z)h;IBn*>W(B z?{UL`+F z>H}}m$A}t3_v!ANA?+667p{A`J?IY3safgyx-VJy`K<5d9}Gigm4IgI<4>ou!;}C} zjwOBJ@s%3qM%Q4*N2R{rRS=)ukMTbwIQuQ~zl9deLo&)|6C*Crgj7Nz(}} zASZ>zOVELg2J1_snm+}!#n+fq*j}^;vG?pFYZLoEfLP|VW3~ORH{n4zpmwD9>od+u zhsnxoX5Mrq<9#+Ah&+5qYTs{`=XwO(AeA@TH{{pL>tojX86{+nKxf$?V+c#YZ%;liH&oM?!1k1=8}06756G1;$E{S5PGXLR*loMY z-`#=1!*%JWMXK-u2)y-V36(wtpEzvNsj>F@x^p( zu$dsRz#+bTg1;~lS_pj+#$|!QKubnO&2klTe_oi_n5{Fgc_lYenRFw99mFCBX&1|- zexDluP^Y57?4q@Nw3ACCkf74LfOVpzKbty5(7wp#{ha9Zz5QT`oL(e%t{ zs_JabF?_RH=4_&A)ZhyPzMyBN$t-3YXTq5jO0Zx>jR*{hsETFfrZDP7vM+#26aO3> zTTNfXqv5E>*vzihV=GN@fBJTdm_Lz$=r=ge0gaE(^pk}b2sXOd{{bzOpl9vvOjP?( zN+RPLm4WPmmRCxk2SosQfxT%XU3flF^`~pEV$=1PTO{m6&6A~a&ZgU=Vl2PT%(gF^ zv@M!nhYQxun#ylZ{-#%qH=BLoFyI_ zg;J31kHaCtEW@LT#?B`!(IMs|puPW|RbibzOW zNlISrLxfY1@3m`{oUZ07;kW#v)@hsk-I!Gl1{m2dd1KEjmTtGJ)Le)Qr>psdC%)e$ z)MU%2lC{=paOWz3%Ki3NlO}l_lu)vfTU_;B{qXpk|432ZuCkVWh=j39LNy%FvU;J3 z5EOqIL03T^BvI5D*Fxl2BPBwi_kT4dly&E<<%`e5jT1~y_7JuVHTv_h0+0$(e-mQ! zPps_U5ca700_>Ixs5{fPF}l6zw9fQS&n>Vx`2cfEG;74BZRyoF5{~{d@pSj* z)FtyROFSRyOjMjq=?o)(Ah;EQ@_+02j>u-#c(lTlJAJ;Jgo7J}`z_&xQ@?NT_%mVv zlP)oVonaQR1}B(V+8n6WN$f&Sc%pDOTG1NblO?+FLg(_B%azKbf-514E zhU%BqW`$M^;#L_Q#XW)xXO>zInhMxxUW1oP*O+EVcjy>(FMgVI%q@S}NVbHac)2+2 z!vc4S_#LEL<(L2q^AzI0o3EH+zbkIhZq2g$q5zZ;G)$)@r15=7ap0LWH1x0X)&d|h z8}_pK^!?-|x0%!=7Ykpcz3AMY4Zih$9<))$=AITyy~735zXL#`-dSt5)q8 z`?76Y$RKyt?O>Qoe=JdWbbv~=n@7ffxdOI&#GxQ6P;yE=tyqPjwqpbNBfVxH6*aNRNaw9Yh^WtG z%qa4Qk&?wC!VX@@j!4NBSka#`ehJeQ^IXar_1k`-L>S<)lSAfWb!3GxBIRHb&;pL0 zaS@O8qr4Mryq0Z+&-F1?SS=i9>n=vCb2d8Sbax&NP0Uenh^Zw_=>&Xg#pS7-36V<6F+ZftIQ_kt0W7^c zG5n2N^ff=m{U-kwIokQXxMaXY2cXS_z@LtBA@15Ubehg56NMRbs94tNYFZul4jkU6KMuPx?qJY;t9^+6o z2UOwJqM;bpsn`k}M>XhDc~WJhV3hWHU^=7sJ1F}j^m|#CwqJ?$8$&?g8bH-cz{v}H zHEU2e@X@X)i$P+&fgHn8TRLa2Cluo6sp45;uBZFO9pYQ^uVx6#q{uL230etUR9Lv5 zORg8|J!Ym?JRz-97w};KZAt$jUvx3r@|OHG?IhWFlzVthQwG=<7aTM^ThAQtLzQVU z63%yB8~y%XMcz#B9`g(9FTh*ON1~viQ`0{GI9Z&Xg8K&Xe3K7`wgp@WFm^4d<{f3N zNPIoMO&fSYdj{_gJ8$d?5s(YDrS6VW(sitVSRmAia$xQ)MgbdkYk1I}8?HZi zFh;SAPH^8KfiAlnmCjfkcJST7=fOTM;4zvX4h-r(uqu`->pY*MX@3|O+Undr+C<1{ z1MCp#UxYnb{_y~p-n|nV`_2hBI1I9NbHS1ej?NuWVmbS`=g>yS%odnDQC0`W-x8Mm zkq5G1pyDn*flHr?1kkEZkZ}T{d0F-1&O73IPW?S$`fRc5%&Q?6kn;rNhf6pD?(EG^ zqp|YnsKMaieK^{xmY~4kZ5<*aus$`!`LswV3_G2&pZQj zva?croLtLbOJBmEKG5$}5)&M}R`3-~C+T6!-c4$}Z)cI90pP3jmiXFRf0{je$J>Sw zm-1Qpm7IJlxv4Aiw#dl7$oRFmEj{!|i|@ul`U0jaUSK^M2=U=*^Bh&1<8{j1nlqR| zi)4ZL0&F{47HvP1`*yQO(CxQ|cTUjV{qe#P7RzMfzVZ?uBx8_@r=2JQqs;q^iJ*)| z3R`IjIrzBv0AOEv_%{W%lxt^pivpE9wZ%-f%T=jNMxK|_7UOM}o!t%i&RIGiOt)|$ zyqEl(Zs?BWex2we&Axkf^0M&0JKn-Pmdj7}YgTrN*)JY>I8TXRGl5S3Ooum+M=?jC z@U2PJf`JzrA`d)X=_5q8U;XP~n}tGz@xwq42qVS~VCxUC??UL%d76$Atr5_CB1Q=) zC#_JrfWH>lM<0Q#r;2+h%TaM`2+I=*5jlgby!<_f%)%G%nBYRFak^D|1}N*1j~1}A z76>aZ<Dor8$jAedWFPVYv{FYhu%h#!!UK|zzWE(~0 z{7I&$V?N9K7e?H*4#R$RcF8lD^T7?`$??5ayY=)HvK9TqcO!b#hR`FjvDrj-XpYN_ zhgfP{jmonAH|{u{&LeKm()Yask-n~IPFcJMAffdpuWI4x&-%!gv}bj-E^z;!hTRS; zx-FRdAxx5e)d&uQ58#19CYkLOzxVom1$+tpe+rGerFEAFEIc-OQt~d6F6j7?7Ez~CCESUqWYCfW_1Cx&M7`0|@;-#6vSeTDcG%mx|6G0ch24k% z80}k(!8%^FH4}PtUWc+nj@Y_OIB0?Q_PS!fDsyc!?>OWrDsB=~CZZIQmCrXGY!r{y z$<89YwnWy;NReTrdi@OY>2~hnZNv0aOhowfWk*mCsS!L%K|5X~h?tJjXc36ud;;v{ z=H6OdC57qsHsCiDsRQ-H=~gj@2a@OjkgSvThneYVuBq_Z28$>?EHhLgAO_cBU}v8M0<;y`Y> zfY$<(j~*B8M}b~n#?3|5E5zwITRScRD3$Wd;)s0pWR=cm`Ru{v-ODEb zkVPIP3=P#8=&jqUZRtRevJ)0Sc-f06-G*)7pPrarSALm#l_zILdhPOnk;q5aGS^lQ z@*tvqc%6{?@3e)E1*Sw$Xu??NJd4cBC%kuR*c|2Sk1yPKUZ-&EB%fX(WKY{8D$>5L z6S12J2pbo_A@MshBNm=7kNMPYDt-nF68dVUo>u#&5?@4DB4?oqd9Q4MgQ^90cPmZC zI}LXBPEtfvhQo}sV6t5u?a^7tz0ya{Hj5lF0RBKxvc>KWm>Gz1jbZ)|TflV$w5Owx z$eN|w1TQB0`!&njXiHpvRxyLg4FJS`?*S@FkP(9ge7yXh-d9DEYDu6qajFl$(@J*V zXOMIpUyUW1W!aJADL?^O3+KMtSib-g?!@wa__JqPSbr;u{6pk$C}AVsKU_xBSty{Y zB?4#YhT}DxYBl_JC_^sZn0UsBgi!&ESKw_hCY6I*S7g@=x%m0?&tMN z5A9_awR~|pjFcJB?wwPO_e{UI3gsr%7o|UKi&MTE861G^*(U?+{!*8?hIbDL6y6vV zdq~S97uRBmYt`3>jYa+Sd5wrmr&>dp7y|ydqN2q~+=Qm8Rl~6J)Vm6kL-MvQI=>!C6m(k|_$)m^U8oc>-waBm z$~(srv1L?fDBj*gTXt7@mL-)IruE)1?D>5tAh>5tI3}vHGISGr1=p9)tD*(gvxV9R zY~05|QX~YrK0{~S9K_?tzyjYDvI1tpd!@W8`jHj*(MSOR{m+>RCd0qHvS$Jj)YusM zoLyp$re_(2C;np{eruEoj<%+8wtg8*34LPMRyu@K%5nWogfVI#Nn=8)txtr-Ir~1= zk}t7TmU@nQrj(tWaupI@MY+1*+pQXyp~GW(8!_2TFit2A^u83r)d@LAs{3Zwh_+AKKfv zNv(fNsp}K0SuxM9Dr`Dsx4rq8l&>xpkl7nUIKIKPQi=V!D8kKx*sX?aY1Wd5FR`f# zd?1TWJ*b;R$1=yoxGjKsl`16s_gGxcaH;pQY0DC-V%`lZEeB4~Ki()T`F&J6le1)Z zYZAbjDN3qMyyiQkge!W{yIs6YnHN2ZkJpE|)OLS|uU42s^%-hEHXJBrqUz$Kqif3l z8Bxquu? z&Bgyjvm4F_#zn1n7`IrNbWl~KN(EcSuS@}BuxL_P7ID$++tX_lenu=k9yy zpfkH1^Kw%!6#h>*}kOh1cLP;$7NZFpoIXsnRO|AMt+P?W5sc01wk-LE_huQO0j2I?f2=NsAW6+|Q ztrMO>yiQ08zm)d^Ec03AVZDLQSNfv8ye%N8eTI_~a4cc8pw`?hNPwNg>%(o9M`eHC z&?Iq?T_kDkY2bjKH(VK$g78*>N&<*K!gYI8TE)vTb)y`RK@&Ym0gv)V9&?) z*Wz*tlI&x%qOct*AcM`&RI&yij5h;sTzcH?)`<2N0)gE9T-`njL zAKs?;2)kGwvlaA4AuhU{3;O*fmiN}JMlFx-W2gPm#8@}p%e3ra3QPEIvFx1+H9tJk zT$dvfSf7OZa#pJ=eJ3>IdB6Ru)pM!R!M>mLh%z#|U`qH{yOH-?u} zWz)Lt58m14U|rEFB-|rQnBO1=BrlUr?5eaR(2F{CQCR*cOIufe?E7KJ7)H6UJgc$Z zHTA9c#wHmrTBJl05V?4repHWufpa~yR1kJT@ZHo-cwgL%z|0UCIuFoY`!i6x$Lpe= z{Js1<+P8gl6<+z-GiP)t4C>@W5t5)Pi5n=JuoIzbcu6-~WnQ|m={ChDlIjiZWNBRu zy8a|?zv?V(s{LUgy?0(*H?63-9n9MYtV1{!bLe00FNtG*>|fp(Nl4ArLL3Oy-02+! zwf-RGfzg80alfTz)CZ6PpK4LOkKZ*$UQ*Y)`g#e@fc^d5)kw_(XHJF>*NfXM|BvO@8tH9Dvy=Al6mlKKG(Ka=ZDwO%xO{|7|(C(T^ zgC=M9uc{-y)LObDU!8MlxG4!z?Y6Nc>Z#|t1EWgu9|28VVOqd@e00*%^yCI`JYil; zVz4T(9NP6C-=(4~-rYAtBlq+NhLTRGAuzEZYP_?#pQU+X#e9UQ@0xLUb?5*_6?KT= zPb*Lzx$Jw5)xMN=D`v<-`$$2_uQS#qs768mEIN|8-I(&~d2f&klnyqHqmmv{xa3O@ z{4d%}V10uSfi(b&|9!BCHI6!>3l=+mpd5Fq(WaTCyXoBQD(cQ)k>E=AWa;0DnKM^d6gg;=@+?Deka$Sxoc7?YQLl0ksbsrTo%9H6 zo0=!Wu44X)o5scp zfj!uwK%;5%kWLeUlO2?+URz#WcitLum|qF|#q57+qb;|6lNz(vX6b}zsBvwr2AfL% zSkF^H>oG0}d-TP&=6A0fmqA?+$)jcA!AkOB*&{z$_(s@(M@pBGjp%vRKw#Hx#lUy#b zT=4Hc0;Bz&&o0qzQ!nH=U#TRjAQ!3a$_&J%45$FhgxLOlTrR!CuBQ@qf~O{xE*f-Wi&249+me6T_p?}(0vErv%3bSgkm*$xQxR!WEd@|I zi;ZzlALZ){)}ySuk7VeoqMaEazH`8An(U|@2R6OOTueCq+XURz(^CaWY(>vnjaJ7p ztF&u;MgyJYxm@m7QbXPh&kSp(CeG82RwFvy32t#jEnsAqpn9^M{J1X`(MC`<>1o@d;(BS>4wBd zB-zv*Go4b;pz7a(+*V26Z5C>B(2g76Jo1Hq#`e|C4TWk0NqJITW(5CvN8)_@rp4G( ziS)BJ=UNed;)E){jZjBA&d;t`Zb!6iY5D2i&}q$dzvU&E%C5993W~EMT2{iRMlR|o z3EWRPVn*sm5~bHajsMEfoCQE*Pu|MHU7E)CT6dDJQq$EKqzC+B%=)Dmm{qa3eV58! z9pN!84d<+U{W6Q**LZJ|Mh1Vl6EZ!|ZVV9X(14wHBTE<7@b;4Mq|Ixo5q92uN<(Wj zvgx7|o!;E0xT;18lsi5Ui?8bRM8h#%s#cHLSb(QXJKq=6u4U6_+5#jq%sH@xn%fu_ zV{ogqhy&fSCNMruqx91Pp=?h;SB)E2&GQV>_NzwG+DTw-FESFy5XB*|=;uBp*Tp^K zk09Fv-vg2MmrWmySE(V&&Frt8^DSw$s^zcB;f5;j=&HLbI}D0APRaW|o}P9RhY}1x zzvOkHFR*I(OK3}y)d8MZStgLtt*}5PbvV)C@tlmW{Vf&fQ|2*r18R~NZ;qth$DwjM zd-4e0P2`<;{x}AM{y-q8P70jg?Xmr|Cd9mOpFQ{CrXq!f0n@veVLJ?Oz!_NSzDHOi z+qo94$Q^i&J!Jv!zy=mqnA6%0yQ=qTwrqfKii6%BKO4#bSXn)*xU3YffY~V;Xr~=2Bx&PWdpI>0% z#tqZrY5ahiT?KT1v>>DU0FVpBMAFQvhuKuxp{%R{-)2(E1|-pEr{b)|x|f4PoNzlk zV#RTnrO)f5T$K<+Y%e=ef*k{_(n1#l7nO2`gDz6e@8fXd!9G{8jU@{@9h(Z#s2Dh{ ziyAj?R0;mEg~Op@bT}tX!q*ri2FMF41Nm7PU5AY*-}1r~Kk_HF1E z(v`B-3zF;DrbHgo0Own-Ojz|;?P<-y2M6If5{#{48l>rZ>ezY*@yJ>S>B*D{+t`;s zFSSF@E=NxX7$ua+#=(EiVhUEM^;F?d&ILb{wS8ce+T5h*PdKqLzc`|ieAvd6tc^> zcmio^y@Soxd+sR_C9OtcZ$4YawzjaBtT<<1Z2)R0>5)*d=iL_k8l0SJ!by4`tdD7$yRJwm&j3z{e_2B=AC^;WkAv}<5ki7}i~ zJ8CHGj7|-iJ%?D0v|`ZgJn9C#)Jj30VqWd{X!e)VZg{$rw1F;7sTd0EYKVmgx5;TP zHQ^O_APe9+?;ikP{EuNe-3c~?>Hr4j|DF{wrDGk7-Iny#-IM>vCryk1Z6}t1J2K6U zhmmOwfnR47e~U_hQi z`|L34ILh#v&{{v3GKG3;A@osX?yU($zFcsGXnmamg(N|S?>!S5SRrs2MkLuXT3h(Y z1D-5VHoS*QdH=2AtpyU^kSsLPbQ@4527DR~ey{?XEOHPyCG~Hsx3HlHyjTG`G}*zN zFskqjNY!3<4**MUo$vyL54aNKJ@Yre;U~pVp?9o$$0JNFt*Y81n>>!#95vxiUpui1@rOBp@;9}5yQ}J z5P=fm;t7R3_|kht{;(zux(2Bd>PU#P{1Qw!HJA(oYy)NwMWa4hMdSaHuM<%=##T#U zi4=r#3wV@Lwfz}(fRBw#jSzA7hg1$wLjDx)H-_R$T)h1Y0v|VgfY=(=NOF3r%wQCd zFxtC(D}&jm7BG^>+q>rul^yc&$b-8U!e{e_4n%o`pxk6Wu%iscG1AfjG@9BcNn*ik%8L$us&tnZ^1M8A#V43Iun&Pbb zGcE_tryx~0^KD!-?UP$r3i3>7J*s*w8iTSLTlqp$r!OW?Cx|Q;+GBHr!W#Zvm^t<- z_RMqNzkQCw&Gd96bc};RXBxBGP&AfVP$-$Cz75de3#GmZ3&9J)lVNG~zh_jU+k{uu zHUK%I02U51gl-LoO2#58+O^;hm5`@PKD2m_!P263GB^RXmvmwwjxjixQtx z;E$2l^n&z?jEHF$1t`YhVsGZ7NQ^N{iCP7{7_tm!_qGbdB6FI44U8z}KU3(=FD+1{ z^#ZVTiZ0;?mt=*3?9otjunkIK(H;oQ{wj!`~s1@aA}6s23O}l(igR*u7sDiXll`t= zGYg`fKWH*0>P@bYQu^S!d*hA6G1j1YHUMDno^U_@YLA$4&k%{U^LGB3OfIw46p9J{ zI3n-D1W6+Lu!FLf4Knadb3kESvw72ez3~NIw9;|UaEsJkX-pND+TmK{NHh^jrl?AD zkNOh9O3g*)lpBoZcus%tMsP&srx zpf2Dzbqv*pHw=xHzG4CzAZzH1cz^^G4Df}vhKNlcqHJ`zD+kqbiVsY|OE^d~+<3$*gIcb>P^@Tq!f-r{C(*&mw< zPURpthLnInK^GIkiX~#>V!eo$fP!@_RAS=RH-=KJXQfV5jLYWI(c7_eLj(NLTUM)t zU2sITCnlaw$|kDeR9yoP9stC-qhAeU#v@-?={rGB#%iAzX%wc^fG*3jBy^4sbR=QY z%mkxwuiLi?ic_|wVcIok7Y5F%?7VmMy2*>6(H-zwS4dUD2SI(v!J%GWbDJ-MA^zwUt4+c>I3SMgS*fEhwe!gs zoTDt{oaby|F(&&Wz|NUF-<0Jz?qsfuh8pp2D~|pERT|YAc;6K%&w;2OpS=U^yg<~z zF5lm6>{YTJcp^LdB$75Bu1dqE!~p7|z+OD^SFonB+dv3wI3}ONapk~B6#P&1-XRpd zlI+eg2;Njj{LwpBJ3z)^=&)_PPvC~ho1jB%y-(nJ;hUhsS07DxjcLW?A1yd>&u)KP zq%VY8c+z*Umg&bp32g5)zPXZWVXg#r>UP`wk z{T$w#V4^NzQSZ31JI21GC zR*tv*7(kBf*wK!Dab^4F_wA0#&%qqelhpy$8`*L`o@G0XqL7A#aJ9zc3 z+qPEygD#VpFyz6+i2+J_qm_&UmVt(Q>y$k0^`et@eRbZ>+UhCC8EGX`$&n4sAb)4!CvOmR^&>$J5+#d*6-3dpdppbJ+nt zOf(9mDzbCLeYJGz7mDLM!4Q_qndOV%{&BPqKe}0Q6q2ON0RDmGUxhe80e3v9;M58D z(Nob;;k5(KMqD&p^w#j^*-Fx~`g*5dnb9ZKq`gsp_!?Q^ug>ZA3z%d#+WGu=SfRh& z1?-GqZ=+|N$(kcfG6K8nu#ttQCP{pO)@QyYcRGPYc_o2YZ`>I%YDW!6Zakr3+O|=9OKUdzy>_;|NB_&4C{{*J z4O4=Bmg@my&188NKs}DI>dhP2c-m;W0O)=#WK=-!9FP&1x88zoX0|XWRtRttCfKU} z!pr}$qS`&R>%pxN!(q2u$)GzW6ihYHelCs5T|&Qg-@XpjqNIYbE3i!jA~V8LAU_x~ z`*h=J->SZ0e;SH&UZi;=Y5jONN}kppDqA8*P^eZ0*6_GAtmMK{ma^+PW#|)f0>ttK zb?o?{EUb0ZrXs zqmtILZ%mVSl_jIowZ~8<=;!KAFM4X5P=(IUsYd=J37-zm&9ZBVdOkm{$bXm&V4Yx7 z>P)YDcDP%)1`)WNE+XDpgR6~90K5bb-i$iMd-alAGQ7dAV_0XljkJzs;=`1_u^mG_ z-+sGK57@T3b{tRV#oht`jcnt#-%+-$anqJDr6+NJl3n>_y;8O2blNwpKe_Cgk#8l- zp?q^v%F>r|e~eADKrtyu+Cx?Gwnwd7^QCTJ@wbUFj2(-nK9->y*xZwHD>PERUoORpbkl1c?jvol)u^9 zw=Jr4Y&zHcYFX2t{!YW*r^>nm z4LElxW+n1|Uw3rvyrw281boJn8Af9xzs>EkA69MJn>XlSIo5K2FzDH#HRx)}w~udS zuGFlsv+Jy$DS@;L9+ntI$H(FD@O!mu#51$wsudquwOz?nv{J=^ZG5Tw-w)uRb1A@h zL`w$R4pa!XVbEwRBoP6*VcD?j0G9{Nc;8qlL@g>|`2-}`N2Q)H0HiXmo{!Lm?6w+O z6l{W6%S;z6yE$Zp@6uAH*4K7zmK@miubvNvh#sEt-5)kOK)-K(aAoK#DtYv`Vpi$I zCAaamY*r@b?0kE&T%=p%!arRd7%=cIK4o>k_1LT?bM_6e5v-++wf2?G&kPVt5B@k> zbfrhLKg`*2Q*!QV0qEmo$a3I#u&eXOr0akkheR(kchAuqmVnrIwUEz-sa9dCgz+mMbgA}x9x=SPb!L4Fh zDu^Czg>vo=c!My>BN}t{^ymSQgdDT%p5ZRum46JutTF~aOn-dZsaqM1l?YK+0v0~V zEurq?-J)Bw+>r@+A5?;V6MWQi$x4mqoZ^GgXHcnwg!*@|U7b8(&djlA0ssdbcy!NO z;9H;uj(#!*07r**-nLs?Po)aO;4-%AHi+)|&;$ud-lSc1uy2LyW5%X4`8kpdhi*s@EB`5#B<`Ryx$rN2mO7FQX4%JFp)9VUCr@yW`WQKe zzPVw@rZXe@*LE~p`?jNk@2cQmizwx21F5_mktfjjtQOF&c{7)%ms-sXNMsyzunllM z!4QfdTWgPYjYw6&8d-CSgz0>u6 zJ?6zU9(k(1vt=_PQH)^OjCy|Fa?kJRc?%M&0z{v~Gdhs$@Pgd_W&Wu8f+`^WeET~a zupu&!Jt~lnv3fF5j45x&1$O2}`}B;|1ffeSZ+@OY%=?4s#T#PH-MxD*>ny%M+ z-X+1Ck6!H|rkbPIxv#1E#eEiGu9hVNI8CgGjRxHUTPrCx?8=3^?)4G`g!sYlu6m_I zJpaL~M2GtXp7ID;=Hyz*dg`pGN-EzmIN!O&)bmb^sS4GCD}T@I^HTH+(KF}uwc%a7 zf2`r-)u6|F1y6VE>6Zj?UeYFhMfsH;1-@-)(B-jYuId%VZU7vsZTg#OO6#Sk@K!AghV z^nqr(T-BTsDuJhg!PCV#V8>6a+`FXO+qm*dYe*xTOoRWOYC`M#rRGPOB2q$~VO^k&e&c4r_5stn z#A>5p7O(m!&h*^GmQV9i#g^~aC5ieHqb|Jq9Sf~*c{A_B`QG|5z@j|V`t9uOtoe;5 zOu1>vJ(Jwp(_&t7d}>WhsTExI=7IdNr2N5Au%sdZ{n*6Tm2B$l97LQ?GlT!9xuoKP zSrM<=RvwX4QJ4Bd#P!?j$>l;T4~+%yyzuQbbYY1nuP?j0TK?bG$eQ`Z5xsSKsp4AH zfZX&ZeY+5ios?ZpdW=4OX5v~f@AvfcyNL-&3(C~a97-3sUd9GS7>F>Dv4DV0IIl*=h#sTdwf=qb&C3*(p8Xd`&We)JXV(|W7Q zTFcxXZcXso0acU!ytef~)I)8SF%Ccrb-mI^jRz=-E2NFl^9D(rf6&3dl4?EH^uxi6 zeLUzTnl>)*O?BDjKduQdW{?Uw6(iR3r1e+ zmTk^9={@za8EV_Qdw)n?&dSlE3ml42&|xR*$%u zpMSfzG`28gEty+?T=h*2cezljV7Af%l-cEiU+5Qpw*Jqb#{QqOs{}JPQUHPRmd3hk z4I`&+E*ar^==V!x%6ur^;jZ)8iytXnM){mo!0QBNpF@D0<(UJEIXQyXWl~H$N+Hrh z(rBdr1_d2|>(wYrmM-D3hp*xe{$A92ILhC(qRtNid`if;D{_A+MuiqZG&f zytyoYp4eae_WFjIo1kdgmH;iERO1}EeC77gp*#~5Lvw3+j@)bmR8-I+X`$GD2^?DV z)7ERoarJGeQEPkAAg%2!esI-|aQ^Glr}dua?=pgQknynicnayT`4jCWUz_O})e#zXk9TihFSHl`3b!Jhk z#g{ZKpefi9v~XBnvhqVi*EB!4k*9wNEt>I_(8Pp5JX05kFh(+gb*9ahS6lph4!70NKZJ zk0%7ENRII&tV3-Ur#5OajTFMCb55hEhaaTI^Dsn;TOX`8m=F0~hT;+UD|W4|d8&jg z8oEpl_vI@tT3ErbCS!?5mxT0_mV{8m{|`h^{BNXF{4W3~LjDgVQ~XcF?Bfh^MmVFK zP)sXk7I35-oStQ8Ux)Ai43^&;DYz#Np@q7$7IQSs3J&-vA z$X&_Z$vw%v$$iNIx<{^T8+oF5+70K}khbFPm-I)u0jp)S!P>_IQEl5a}XPrt;}ggF7Q4i?=VjlPpWg zQcEQFQPp+TS2<@(ZLZn-Vn;81Sn-sBa!ba9l_yb|2b`4zGxsi~K#PRNSs&WuJVJIt;qyf{&p_WlM8c|XqOND4yw;h8KTDOTm`<+#Vw5;`O1_QA1 zeYvX^i)evN1#y~4Y3$kZ^bocH>Lcms&V<&>z05vgn9Sa*B(|ddJUM$Di$o$8sK~&3 ztc^%N)1YAt-QY&2-9paKlNuqpaHV{K?bp4+JyO?7nk0m>0_iJGF1f^ri^aabf6rd` zdJii5OiLDUbX0k%7A$Ozq=-F8d9k$jG{K%0er1szsuby#RpxRKt3)IKj6w2cndAa; z9SeHHqAG)^nnVxgkEF)ufig}<87uvYNJ7F_$f*hh)6*Z_RI8PKKipB|Yp61 za>5a1CE-PCSkZJXch{#Xr#rc3k%5nv?jPR!V4!mSJL5Y8qJKW;i&5wI`#c!B$7_i!m?E-EcWZNP71(DR zSYpd=)~neU9k=doV2=4!^YK=!NqjaO8+!QojVYo!wD#KN$lYWwj?(ePQIZ`AN9^m6H^o6QP+*cj&|a#f_ou;8IPO`?YZpdkHy1EG%^Dp6|I zy+NlQceih#O7Csv-=!rAbJS|r!N+%SmUDQr>0mLy>L=k@?S8+gw7uOEbXFZ`hI(gF zetnQHrou~g?QZ7Rr47GYyw>>MfIf6{)v0YD9)W#gv4zG8HeYm~9(iH;(roMCKA6Ay z5psXCpV{T}^S-qP$U@8-j6CktruFmZe1yZ9a&%%D`NVftAn+@VIc{03vnjq6{pHHT zN6|05RQFQq{6nHBQpylBP*M+nW-_O3A3RY-~TNE{oh0q3JnPUd6XdoQUL4!F9aoBSW-$>L;>5q z5!ND=u~DqUM!b}RL4of0*Zw_Fp`kCAsduqD!D16be-6{!pVu4Ap3|EG30`05sVJb0 z5TZ*<2^cvDRKOYk=tT8OMD<%78o~?{;U6&IAu}K* zDEt{q4Jbh8gjMjpS2piwHny9iVijw$Ga7K(Harh8iL&#F6*@D7NdGwu zy4k0@IUu?@0?ac=sxyqLjS~baI;?rzkOFF$`d0EuQ_+}t*(gECI7t~(xXR#eLZS-m zEKNj7hx5fAuhie!DG>n=eLsOcNdXh^Qz_?^@V^P=>|*HT;^Aa!2F1j}!p00mN-8QZ H2KD~{iiktT diff --git a/gpu-vendor-model-matrix.svg b/gpu-vendor-model-matrix.svg index bb27047..1154f57 100644 --- a/gpu-vendor-model-matrix.svg +++ b/gpu-vendor-model-matrix.svg @@ -1 +1 @@ -FullvendorsupportVendorsupport,butnot(yet)entirelycomprehensiveIndirect,butcomprehensivesupport,byvendorComprehensivesupport,butnotbyvendorLimited,probablyindirectsupport–butatleastsomeNodirectsupportavailable,butofcourseonecouldISO-C-bindyourwaythroughitordirectlylinkthelibrariesC++C++(sometimesalsoC)FortranFortranCUDAHIPSYCLOpenACCOpenMPStandardKokkosALPAKAC++FortranC++FortranC++FortranC++FortranC++FortranC++FortranC++FortranC++FortranPythonNVIDIA1234567891011121314151617AMD18192042162223242425252614271628Intel293031432633333434353637143816391:CUDAC/C++issupportedonNVIDIAGPUsthroughtheCUDAToolkit2:CUDAFortran,aproprietaryFortranextension,issupportedonNVIDIAGPUsviatheNVIDIAHPCSDK3:HIPprogramscandirectlyuseNVIDIAGPUsviaaCUDAbackend;HIPismaintainedbyAMD4:NosuchthinglikeHIPforFortran5:SYCLcanbeusedonNVIDIAGPUswithexperimentalsupporteitherinSYCLdirectlyorinDPC++,orviahipSYCL6:NosuchthinglikeSYCLforFortran7:OpenACCC/C++supportedonNVIDIAGPUsdirectly(andbest)throughNVIDIAHPCSDK;additional,somewhatlimitedsupportbyGCCCcompilerandinLLVMthroughClacc8:OpenACCFortransupportedonNVIDIAGPUsdirectly(andbest)throughNVIDIAHPCSDK;additional,somewhatlimitedsupportbyGCCFortrancompilerandFlacc9:OpenMPinC++supportedonNVIDIAGPUsthroughNVIDIAHPCSDK(albeitwithafewlimits),byGCC,andClang;seeOpenMPECPBoFonstatusin2022.10:OpenMPinFortransupportedonNVIDIAGPUsthroughNVIDIAHPCSDK(butnotfullOpenMPfeaturesetavailable),byGCC,andFlang11:pSTLfeaturessupportedonNVIDIAGPUsthroughNVIDIAHPCSDK12:StandardLanguageparallelfeaturessupportedonNVIDIAGPUsthroughNVIDIAHPCSDK13:KokkossupportsNVIDIAGPUsbycallingCUDAaspartofthecompilationprocess14:KokkosisaC++model,butanoficialcompatibilitylayer(FortranLanguageCompatibilityLayer,FLCL)isavailable.15:AlpakasupportsNVIDIAGPUsbycallingCUDAaspartofthecompilationprocess16:AlpakaisaC++model17:ThereisavastcommunityofofloadingPythoncodetoNVIDIAGPUs,likeCuPy,Numba,cuNumeric,andmanyothers;NVIDIAactivelysupportsalotofthem,buthasnodirectproductlikeCUDAforPython;so,thestatusissomewhereinbetween18:hipifybyAMDcantranslateCUDAcallstoHIPcallswhichrunsnativelyonAMDGPUs19:AMDofersaSource-to-SourcetranslatortoconvertsomeCUDAFortranfunctionalitytoOpenMPforAMDGPUs(gpufort);inaddition,thereareROCmlibrarybindingsforFortraninhipfortOpenACC/CUDAFortranSource-to-Sourcetranslator20:HIPisthepreferrednativeprogrammingmodelforAMDGPUs21:SYCLcanuseAMDGPUs,forexamplewithhipSYCLorDPC++forHIPAMD22:OpenACCC/C++canbeusedonAMDGPUsviaGCCorClacc;also,Intel'sOpenACCtoOpenMPSource-to-SourcetranslatorcanbeusedtogenerateOpenMPdirectivesfromOpenACCdirectives23:OpenACCFortrancanbeusedonAMDGPUsviaGCC;also,AMD'sgpufortSource-to-SourcetranslatorcanmoveOpenACCFortrancodetoOpenMPFortrancode,andalsoIntel'stranslatorcanwork24:AMDofersadedicated,Clang-basedcompilerforusingOpenMPonAMDGPUs:AOMP;itsupportsbothC/C++(Clang)andFortran(Flang,example)25:Currently,no(known)waytolaunchStandard-basedparallelalgorithmsonAMDGPUs26:KokkossupportsAMDGPUsthroughHIP27:AlpakasupportsAMDGPUsthroughHIP28:AMDdoesnotoficiallysupportGPUprogrammingwithPython(alsonotsemi-oficiallylikeNVIDIA),butthird-partysupportisavailable,forexamplethroughNumba(currentlyinactive)oraHIPversionofCuPy29:SYCLomatictranslatesCUDAcodetoSYCLcode,allowingittorunonIntelGPUs;also,Intel'sDPC++CompatibilityToolcantransformCUDAtoSYCL30:Nodirectsupport,onlyviaISOCbindings,butatleastanexamplecanbefoundonGitHub;it'sprettyscarceandnotbyIntelitself,though31:CHIP-SPVsupportsmappingCUDAandHIPtoOpenCLandIntel'sLevelZero,makingitrunonIntelGPUs32:SYCListheprimeprogrammingmodelforIntelGPUs;actually,SYCLisonlyastandard,whileIntel'simplementationofitiscalledDPC++(DataParallelC++),whichextendstheSYCLstandardinvariousplaces;actuallyactually,IntelnamespaceseverythingoneAPIthesedays,sothefullpropernameisInteloneAPIDPC++(whichincorporatesaC++compilerandalsoalibrary)33:OpenACCcanbeusedonIntelGPUsbytranslatingthecodetoOpenMPwithIntel'sSource-to-Sourcetranslator34:IntelhasextensivesupportforOpenMPthroughtheirlatestcompilers35:IntelsupportspSTLalgorithmsthroughtheirDPC++Library(oneDPL;GitHub).It'sheavilynamespacedandnotyetonthesamelevelasNVIDIA36:WithInteloneAPI2022.3,IntelsupportsDOCONCURRENTwithGPUofloading37:KokkossupportsIntelGPUsthroughSYCL38:Alpakav0.9.0introducesexperimentalSYCLsupport39:Notalotofsupportavailableatthemoment,butnotablyDPNP,aSYCL-baseddrop-inreplacementforNumpy,andnumba-dpex,anextensionofNumbaforDPC++.1 \ No newline at end of file +FullvendorsupportVendorsupport,butnot(yet)entirelycomprehensiveIndirect,butcomprehensivesupport,byvendorComprehensivesupport,butnotbyvendorLimited,probablyindirectsupport–butatleastsomeNodirectsupportavailable,butofcourseonecouldISO-C-bindyourwaythroughitordirectlylinkthelibrariesC++C++(sometimesalsoC)FortranFortranCUDAHIPSYCLOpenACCOpenMPStandardKokkosALPAKAC++FortranC++FortranC++FortranC++FortranC++FortranC++FortranC++FortranC++FortranPythonNVIDIA1234567891011121314151617AMD18192042162223242425252614271628Intel2930313233634343535363738143916401:CUDAC/C++issupportedonNVIDIAGPUsthroughtheCUDAToolkit2:CUDAFortran,aproprietaryFortranextension,issupportedonNVIDIAGPUsviatheNVIDIAHPCSDK3:HIPprogramscandirectlyuseNVIDIAGPUsviaaCUDAbackend;HIPismaintainedbyAMD4:NosuchthinglikeHIPforFortran,butAMDofersFortraninterfacestoHIPandROCmlibrariesinhipfort5:SYCLcanbeusedonNVIDIAGPUswithexperimentalsupporteitherinSYCLdirectlyorinDPC++,orviahipSYCL6:NosuchthinglikeSYCLforFortran7:OpenACCC/C++supportedonNVIDIAGPUsdirectly(andbest)throughNVIDIAHPCSDK;additional,somewhatlimitedsupportbyGCCCcompilerandinLLVMthroughClacc8:OpenACCFortransupportedonNVIDIAGPUsdirectly(andbest)throughNVIDIAHPCSDK;additional,somewhatlimitedsupportbyGCCFortrancompilerandFlacc9:OpenMPinC++supportedonNVIDIAGPUsthroughNVIDIAHPCSDK(albeitwithafewlimits),byGCC,andClang;seeOpenMPECPBoFonstatusin2022.10:OpenMPinFortransupportedonNVIDIAGPUsthroughNVIDIAHPCSDK(butnotfullOpenMPfeaturesetavailable),byGCC,andFlang11:pSTLfeaturessupportedonNVIDIAGPUsthroughNVIDIAHPCSDK12:StandardLanguageparallelfeaturessupportedonNVIDIAGPUsthroughNVIDIAHPCSDK13:KokkossupportsNVIDIAGPUsbycallingCUDAaspartofthecompilationprocess14:KokkosisaC++model,butanoficialcompatibilitylayer(FortranLanguageCompatibilityLayer,FLCL)isavailable.15:AlpakasupportsNVIDIAGPUsbycallingCUDAaspartofthecompilationprocess16:AlpakaisaC++model17:ThereisavastcommunityofofloadingPythoncodetoNVIDIAGPUs,likeCuPy,Numba,cuNumeric,andmanyothers;NVIDIAactivelysupportsalotofthem,buthasnodirectproductlikeCUDAforPython;so,thestatusissomewhereinbetween18:hipifybyAMDcantranslateCUDAcallstoHIPcallswhichrunsnativelyonAMDGPUs19:AMDofersaSource-to-SourcetranslatortoconvertsomeCUDAFortranfunctionalitytoOpenMPforAMDGPUs(gpufort);inaddition,thereareROCmlibrarybindingsforFortraninhipfortOpenACC/CUDAFortranSource-to-Sourcetranslator20:HIPisthepreferrednativeprogrammingmodelforAMDGPUs21:SYCLcanuseAMDGPUs,forexamplewithhipSYCLorDPC++forHIPAMD22:OpenACCC/C++canbeusedonAMDGPUsviaGCCorClacc;also,Intel'sOpenACCtoOpenMPSource-to-SourcetranslatorcanbeusedtogenerateOpenMPdirectivesfromOpenACCdirectives23:OpenACCFortrancanbeusedonAMDGPUsviaGCC;also,AMD'sgpufortSource-to-SourcetranslatorcanmoveOpenACCFortrancodetoOpenMPFortrancode,andalsoIntel'stranslatorcanwork24:AMDofersadedicated,Clang-basedcompilerforusingOpenMPonAMDGPUs:AOMP;itsupportsbothC/C++(Clang)andFortran(Flang,example)25:Currently,no(known)waytolaunchStandard-basedparallelalgorithmsonAMDGPUs26:KokkossupportsAMDGPUsthroughHIP27:AlpakasupportsAMDGPUsthroughHIP28:AMDdoesnotoficiallysupportGPUprogrammingwithPython(alsonotsemi-oficiallylikeNVIDIA),butthird-partysupportisavailable,forexamplethroughNumba(currentlyinactive)oraHIPversionofCuPy29:SYCLomatictranslatesCUDAcodetoSYCLcode,allowingittorunonIntelGPUs;also,Intel'sDPC++CompatibilityToolcantransformCUDAtoSYCL30:Nodirectsupport,onlyviaISOCbindings,butatleastanexamplecanbefoundonGitHub;it'sprettyscarceandnotbyIntelitself,though31:CHIP-SPVsupportsmappingCUDAandHIPtoOpenCLandIntel'sLevelZero,makingitrunonIntelGPUs32:NosuchthinglikeHIPforFortran33:SYCListheprimeprogrammingmodelforIntelGPUs;actually,SYCLisonlyastandard,whileIntel'simplementationofitiscalledDPC++(DataParallelC++),whichextendstheSYCLstandardinvariousplaces;actuallyactually,IntelnamespaceseverythingoneAPIthesedays,sothefullpropernameisInteloneAPIDPC++(whichincorporatesaC++compilerandalsoalibrary)34:OpenACCcanbeusedonIntelGPUsbytranslatingthecodetoOpenMPwithIntel'sSource-to-Sourcetranslator35:IntelhasextensivesupportforOpenMPthroughtheirlatestcompilers36:IntelsupportspSTLalgorithmsthroughtheirDPC++Library(oneDPL;GitHub).It'sheavilynamespacedandnotyetonthesamelevelasNVIDIA37:WithInteloneAPI2022.3,IntelsupportsDOCONCURRENTwithGPUofloading38:KokkossupportsIntelGPUsthroughSYCL39:Alpakav0.9.0introducesexperimentalSYCLsupport40:Notalotofsupportavailableatthemoment,butnotablyDPNP,aSYCL-baseddrop-inreplacementforNumpy,andnumba-dpex,anextensionofNumbaforDPC++.1 \ No newline at end of file diff --git a/gpu-vendor-model-matrix.table.html b/gpu-vendor-model-matrix.table.html index c7677ca..e6ac828 100644 --- a/gpu-vendor-model-matrix.table.html +++ b/gpu-vendor-model-matrix.table.html @@ -63,7 +63,7 @@ 3 - 4 + 4 5 @@ -103,7 +103,7 @@ 20 - 4 + 4 21 @@ -141,33 +141,33 @@ 31 - 4 + 32 - 32 + 33 6 - 33 + 34 - 33 + 34 - 34 + 35 - 34 + 35 - 35 + 36 - 36 + 37 - 37 + 38 14 - 38 + 39 16 - 39 + 40 @@ -175,7 +175,7 @@

  • 1: CUDA C/C++ is supported on NVIDIA GPUs through the CUDA Toolkit
  • 2: CUDA Fortran, a proprietary Fortran extension, is supported on NVIDIA GPUs via the NVIDIA HPC SDK
  • 3: HIP programs can directly use NVIDIA GPUs via a CUDA backend; HIP is maintained by AMD
  • -
  • 4: No such thing like HIP for Fortran
  • +
  • 4: No such thing like HIP for Fortran, but AMD offers Fortran interfaces to HIP and ROCm libraries in hipfort
  • 5: SYCL can be used on NVIDIA GPUs with experimental support either in SYCL directly or in DPC++, or via hipSYCL
  • 6: No such thing like SYCL for Fortran
  • 7: OpenACC C/C++ supported on NVIDIA GPUs directly (and best) through NVIDIA HPC SDK; additional, somewhat limited support by GCC C compiler and in LLVM through Clacc
  • @@ -203,13 +203,14 @@
  • 29: SYCLomatic translates CUDA code to SYCL code, allowing it to run on Intel GPUs; also, Intel's DPC++ Compatibility Tool can transform CUDA to SYCL
  • 30: No direct support, only via ISO C bindings, but at least an example can be found on GitHub; it's pretty scarce and not by Intel itself, though
  • 31: CHIP-SPV supports mapping CUDA and HIP to OpenCL and Intel's Level Zero, making it run on Intel GPUs
  • -
  • 32: SYCL is the prime programming model for Intel GPUs; actually, SYCL is only a standard, while Intel's implementation of it is called DPC++ (Data Parallel C++), which extends the SYCL standard in various places; actually actually, Intel namespaces everything oneAPI these days, so the full proper name is Intel oneAPI DPC++ (which incorporates a C++ compiler and also a library)
  • -
  • 33: OpenACC can be used on Intel GPUs by translating the code to OpenMP with Intel's Source-to-Source translator
  • -
  • 34: Intel has extensive support for OpenMP through their latest compilers
  • -
  • 35: Intel supports pSTL algorithms through their DPC++ Library (oneDPL; GitHub). It's heavily namespaced and not yet on the same level as NVIDIA
  • -
  • 36: With Intel oneAPI 2022.3, Intel supports DO CONCURRENT with GPU offloading
  • -
  • 37: Kokkos supports Intel GPUs through SYCL
  • -
  • 38: Alpaka v0.9.0 introduces experimental SYCL support
  • -
  • 39: Not a lot of support available at the moment, but notably DPNP, a SYCL-based drop-in replacement for Numpy, and numba-dpex, an extension of Numba for DPC++.
  • +
  • 32: No such thing like HIP for Fortran
  • +
  • 33: SYCL is the prime programming model for Intel GPUs; actually, SYCL is only a standard, while Intel's implementation of it is called DPC++ (Data Parallel C++), which extends the SYCL standard in various places; actually actually, Intel namespaces everything oneAPI these days, so the full proper name is Intel oneAPI DPC++ (which incorporates a C++ compiler and also a library)
  • +
  • 34: OpenACC can be used on Intel GPUs by translating the code to OpenMP with Intel's Source-to-Source translator
  • +
  • 35: Intel has extensive support for OpenMP through their latest compilers
  • +
  • 36: Intel supports pSTL algorithms through their DPC++ Library (oneDPL; GitHub). It's heavily namespaced and not yet on the same level as NVIDIA
  • +
  • 37: With Intel oneAPI 2022.3, Intel supports DO CONCURRENT with GPU offloading
  • +
  • 38: Kokkos supports Intel GPUs through SYCL
  • +
  • 39: Alpaka v0.9.0 introduces experimental SYCL support
  • +
  • 40: Not a lot of support available at the moment, but notably DPNP, a SYCL-based drop-in replacement for Numpy, and numba-dpex, an extension of Numba for DPC++.
  • \ No newline at end of file diff --git a/gpu-vendor-model-matrix.table.tex b/gpu-vendor-model-matrix.table.tex index ab4bf6e..7031891 100644 --- a/gpu-vendor-model-matrix.table.tex +++ b/gpu-vendor-model-matrix.table.tex @@ -38,11 +38,11 @@ \Python \\ NVIDIA & - \fullok\refwithstate{cudac} & \fullok\refwithstate{cudafortran} & \indirectok\refwithstate{nvidiahip} & \nope\refwithstate{hipfortran} & \nonvendorok\refwithstate{nvidiasycl} & \nope\refwithstate{syclfortran} & \fullok\refwithstate{openaccc} & \fullok\refwithstate{openaccfortran} & \prettyok\fullok\refwithstate{nvidiaopenmpc} & \prettyok\fullok\refwithstate{nvidiaopenmpfortran} & \fullok\refwithstate{nvidiastandardc} & \fullok\refwithstate{nvidiastandardfortran} & \nonvendorok\refwithstate{nvidiakokkosc} & \somesupport\refwithstate{nvidiakokkosfortran} & \nonvendorok\refwithstate{nvidiaalpakac} & \nope\refwithstate{nvidiaalpakafortran} & \prettyok\nonvendorok\refwithstate{nvidiapython} \\ + \fullok\refwithstate{cudac} & \fullok\refwithstate{cudafortran} & \indirectok\refwithstate{nvidiahip} & \nope\refwithstate{nvidiahipfortran} & \nonvendorok\refwithstate{nvidiasycl} & \nope\refwithstate{syclfortran} & \fullok\refwithstate{openaccc} & \fullok\refwithstate{openaccfortran} & \prettyok\fullok\refwithstate{nvidiaopenmpc} & \prettyok\fullok\refwithstate{nvidiaopenmpfortran} & \fullok\refwithstate{nvidiastandardc} & \fullok\refwithstate{nvidiastandardfortran} & \nonvendorok\refwithstate{nvidiakokkosc} & \somesupport\refwithstate{nvidiakokkosfortran} & \nonvendorok\refwithstate{nvidiaalpakac} & \nope\refwithstate{nvidiaalpakafortran} & \prettyok\nonvendorok\refwithstate{nvidiapython} \\ AMD & - \indirectok\refwithstate{amdcudac} & \somesupport\refwithstate{amdcudafortran} & \fullok\refwithstate{amdhipc} & \nope\refwithstate{hipfortran} & \indirectok\refwithstate{amdsyclc} & \nope\refwithstate{syclfortran} & \nonvendorok\refwithstate{amdopenaccc} & \nonvendorok\somesupport\refwithstate{amdopenaccfortran} & \fullok\refwithstate{amdopenmp} & \fullok\refwithstate{amdopenmp} & \nope\refwithstate{amdstandard} & \nope\refwithstate{amdstandard} & \nonvendorok\refwithstate{amdkokkosc} & \somesupport\refwithstate{nvidiakokkosfortran} & \nonvendorok\refwithstate{amdalpakac} & \nope\refwithstate{nvidiaalpakafortran} & \somesupport\refwithstate{amdpython} \\ + \indirectok\refwithstate{amdcudac} & \somesupport\refwithstate{amdcudafortran} & \fullok\refwithstate{amdhipc} & \nope\refwithstate{nvidiahipfortran} & \indirectok\refwithstate{amdsyclc} & \nope\refwithstate{syclfortran} & \nonvendorok\refwithstate{amdopenaccc} & \nonvendorok\somesupport\refwithstate{amdopenaccfortran} & \fullok\refwithstate{amdopenmp} & \fullok\refwithstate{amdopenmp} & \nope\refwithstate{amdstandard} & \nope\refwithstate{amdstandard} & \nonvendorok\refwithstate{amdkokkosc} & \somesupport\refwithstate{nvidiakokkosfortran} & \nonvendorok\refwithstate{amdalpakac} & \nope\refwithstate{nvidiaalpakafortran} & \somesupport\refwithstate{amdpython} \\ Intel & - \indirectok\refwithstate{intelcudac} & \nope\refwithstate{intelcudafortran} & \somesupport\refwithstate{intelhipc} & \nope\refwithstate{hipfortran} & \fullok\refwithstate{intelsyclc} & \nope\refwithstate{syclfortran} & \somesupport\refwithstate{intelopenacc} & \somesupport\refwithstate{intelopenacc} & \fullok\refwithstate{intelopenmp} & \fullok\refwithstate{intelopenmp} & \nope\refwithstate{prettyok} & \prettyok\refwithstate{intelstandardfortran} & \nonvendorok\refwithstate{intelkokkosc} & \somesupport\refwithstate{nvidiakokkosfortran} & \somesupport\refwithstate{intelalpakac} & \nope\refwithstate{nvidiaalpakafortran} & \somesupport\refwithstate{intelpython} \\ + \indirectok\refwithstate{intelcudac} & \nope\refwithstate{intelcudafortran} & \somesupport\refwithstate{intelhipc} & \nope\refwithstate{intelhipfortran} & \fullok\refwithstate{intelsyclc} & \nope\refwithstate{syclfortran} & \somesupport\refwithstate{intelopenacc} & \somesupport\refwithstate{intelopenacc} & \fullok\refwithstate{intelopenmp} & \fullok\refwithstate{intelopenmp} & \nope\refwithstate{prettyok} & \prettyok\refwithstate{intelstandardfortran} & \nonvendorok\refwithstate{intelkokkosc} & \somesupport\refwithstate{nvidiakokkosfortran} & \nonvendorok\refwithstate{intelalpakac} & \nope\refwithstate{nvidiaalpakafortran} & \somesupport\refwithstate{intelpython} \\ \end{tabular} \end{frame} @@ -53,7 +53,7 @@ \item \ref{cudac}: CUDA C/C++ is supported on NVIDIA GPUs through the \href{https://developer.nvidia.com/cuda-toolkit}{CUDA Toolkit} \item \ref{cudafortran}: CUDA Fortran, a proprietary Fortran extension, is supported on NVIDIA GPUs via the \href{https://developer.nvidia.com/hpc-sdk}{NVIDIA HPC SDK} \item \ref{nvidiahip}: \href{https://github.com/ROCm-Developer-Tools/HIP}{HIP} programs can directly use NVIDIA GPUs via a CUDA backend; HIP is maintained by AMD - \item \ref{hipfortran}: No such thing like HIP for Fortran + \item \ref{nvidiahipfortran}: No such thing like HIP for Fortran, but AMD offers Fortran interfaces to HIP and ROCm libraries in \href{https://github.com/ROCmSoftwarePlatform/hipfort}{hipfort} \item \ref{nvidiasycl}: SYCL can be used on NVIDIA GPUs with \emph{experimental} support either in \href{https://github.com/codeplaysoftware/sycl-for-cuda/blob/cuda/sycl/doc/GetStartedWithSYCLCompiler.md\#build-sycl-toolchain-with-support-for-nvidia-cuda}{SYCL} directly or in \href{https://github.com/intel/llvm/blob/sycl/sycl/doc/GetStartedGuide.md\#build-dpc-toolchain-with-support-for-nvidia-cuda}{DPC++}, or via \href{https://github.com/illuhad/hipSYCL}{hipSYCL} \item \ref{syclfortran}: No such thing like SYCL for Fortran \item \ref{openaccc}: OpenACC C/C++ supported on NVIDIA GPUs directly (and best) through NVIDIA HPC SDK; additional, somewhat limited support by \href{https://gcc.gnu.org/wiki/OpenACC}{GCC C compiler} and in LLVM through \href{https://csmd.ornl.gov/project/clacc}{Clacc} @@ -81,6 +81,7 @@ \item \ref{intelcudac}: \href{https://github.com/oneapi-src/SYCLomatic}{SYCLomatic} translates CUDA code to SYCL code, allowing it to run on Intel GPUs; also, Intel\textquotesingle s \href{https://www.intel.com/content/www/us/en/developer/tools/oneapi/dpc-compatibility-tool.html}{DPC++ Compatibility Tool} can transform CUDA to SYCL \item \ref{intelcudafortran}: No direct support, only via ISO C bindings, but at least an example can be \href{https://github.com/codeplaysoftware/SYCL-For-CUDA-Examples/tree/master/examples/fortran_interface}{found on GitHub}; it\textquotesingle s pretty scarce and not by Intel itself, though \item \ref{intelhipc}: \href{https://github.com/CHIP-SPV/chip-spv}{CHIP-SPV} supports mapping CUDA and HIP to OpenCL and Intel\textquotesingle s Level Zero, making it run on Intel GPUs + \item \ref{intelhipfortran}: No such thing like HIP for Fortran \item \ref{intelsyclc}: \href{https://www.khronos.org/sycl/}{SYCL} is the prime programming model for Intel GPUs; actually, SYCL is only a standard, while Intel\textquotesingle s implementation of it is called \href{https://www.intel.com/content/www/us/en/developer/tools/oneapi/data-parallel-c-plus-plus.html}{DPC++} (\emph{Data Parallel C++}), which extends the SYCL standard in various places; actually actually, Intel namespaces everything \emph{oneAPI} these days, so the \emph{full} proper name is Intel oneAPI DPC++ (which incorporates a C++ compiler and also a library) \item \ref{intelopenacc}: OpenACC can be used on Intel GPUs by translating the code to OpenMP with \href{https://github.com/intel/intel-application-migration-tool-for-openacc-to-openmp}{Intel\textquotesingle s Source-to-Source translator} \item \ref{intelopenmp}: Intel has \href{https://www.intel.com/content/www/us/en/develop/documentation/get-started-with-cpp-fortran-compiler-openmp/top.html}{extensive support for OpenMP} through their latest compilers