Tim Besard在过去几个月里有几个Cuda.jl版本,许多错误修正和许多令人兴奋的新功能,以改善朱莉娅的GPU编程:CUArray现在支持的Isbits Onions,Cuda.jl可以发出与nvidia一起使用的调试信息工具和编译器的更改使其更容易使用最新版本的CUDA Toolkit。
工会是表示一种或另一个类型的值,例如,可以是整数的值或浮点。如果联盟的所有可能的元素类型都是所谓的比特术,可以连续地存储在内存中,这些类型的结合也可以连续存储。这种优化由阵列类型实现,可以存储这样的" isbits工会"内联,而不是将指针存储到堆分配的框。有关更多详细信息,请参阅Julia文档。
使用CUDA.JL 3.3,CUARRAY GPU数组类型现在也支持此优化。这意味着您可以安全地将CUARRASE分配与isbits Union元素类型并执行GPU加速操作然后:
将这些CUARRAYS传递给内核并使用联盟(那里)也是安全的:
朱莉娅>函数内核(a)i = threadidx()。x如果a [i]!==没有a [i] + = 1结束返回endjulia> @cuda线程= 3个内核(a)julia> A3元素CUArray {Union {nother,Int64},1}:2没有4
此功能特别有价值代表缺失值,并且是GPU对DataFrames.jl支持的重要步骤。
另一个值得注意的添加是对发射调试和位置信息的支持。调试级别,通过传递-g< lett; letch;对于朱莉娅可执行文件,确定发出了多少信息。级别1的默认值仅支持不应影响性能的位置信息指令。传递-g0禁用此操作,同时传递-g2还启用DWARF调试信息的输出并在调试模式下编译。
位置信息由于各种原因很有用。许多工具,如NVIDIA分析器,使用它有助于源代码的CuroLate说明:
$ cuda-gdb --args julia-g2例子/ vadd.jl(cuda-gdb)设置CUDA Break_On_Launch所有(CUDA-GDB)运行[切换焦点到CUDA内核0,GRID 1,块(0,0,0),线程(0,0,0),设备0,SM 0,Warp 0,Lane 0]宏扩展()在.julia / packages / llvm / hhqud / src / interop / base.jl:7474 base.llvmcall(($ IR,$ FN),$ Rettyp,$ argtyp,$(args.args ...))(CUDA-GDB)BT#0宏扩展()在.julia / packages / llvm / hhqud / src / interop / base。 JL:74#1宏扩展().julia / dev / cuda / src / device / cutinics / indexing.jl:6#2 _index()在.julia / dev / cuda / src / device / continsics / indexing.jl :6#3 blockidx_x()at .julia / dev / cuda / src / device / cultinsics / indexing.jl:56#4 blockidx()在.julia / dev / cuda / src / device / cutinics / indexing.jl:76 #5 julia_vadd&lt;&lt;&lt;&gt;&gt; (a = ...,b = ...,c = ...).julia / dev / cuda / emplice / vadd.jl:6(CUDA-GDB)F 5#5 Julia_VADD <&lt;&lt;( 1,1,1),(12,1,1)&gt;&gt;&gt; (a = ...,b = ...,c = ...).julia / dev / cuda / simem / vadd.jl:66 i =(blockidx()。x-1)* blockdim()。 x + threadidx()。x(cuda-gdb)l1使用cuda45函数VADD(A,B,C)6 i =(blockidx()。x-1)* blockdim()。x + threadidx()。x7 c [i] = a [i] + b [i] 8 return9端10
与始终一样,新的CUDA.JL版本有更新支持CUDA Toolkit。 CUDA.JL现在与CUDA 11.3兼容,以及CUDA 11.3更新1.用户不必为这些版本做任何更新的东西,因为CUDA.JL将自动选择和下载最新的支持版本。
当然,对于CUDA.JL使用最新版本的CUDA Toolkit,需要一个充分最新版本的NVIDIA驱动程序。在CUDA 11.0之前,司机&#39; CUDA兼容性是一个严格的下限,每个次要的CUDA释放都需要驱动程序更新。 CUDA 11.0具有增强的兼容性选项,如语义版本控制,例如,CUDA 11.3可用于仅支持CUDA 11.0的NVIDIA驱动程序。 CUDA.JL现在在选择兼容的工具包时遵循语义版本,使得更容易使用Julia的最新版本的CUDA Toolkit。
对于那些有兴趣的人:实现语义版本控制需要CUDA.JL编译器使用PTXA而不是驱动程序&#39; s嵌入式JIT来生成GPU机器代码。与此同时,CUDA.JL的许多部分仍然使用CUDA驱动器API,所以它始终建议将您的NVIDIA驱动程序保持最新。
为了克服启动内核的成本,CUDA使得可以构建计算图形,并执行比底层操作更少的开销的图形。在CUDA.JL中,我们可以轻松访问API以录制和执行这些图形:
a = cuda.zeros(int,1)#确保编译操作。+ = 1#capturegraph = capture()执行a。+ = 1d @测试阵列(a)== [1]#didn&#39; t什么都是#Instantiate和Launchexec =实例化(图)cuda.launch(exec)@test array(a)== [2]#更新和实例/启动againgraph' = capture()执行。+ = 2endupdate(exec,图表' )cuda.launch(exec)@test array(a)== [4]
此操作序列是足够的,我们提供了一种自动记录,更新,实例化和启动图形的高级@CapTure宏包装: 设备侧随机数发生器IN现在基于Philox2x,大大提高了随机性的质量(通过Bigcrush),同时允许从发散线程呼叫兰特()。 当使用时,现在仅在使用时下载并初始化所属的库,如Cudnn和Cutensor。 在屈服和睡眠之前,同步()函数首先旋转,以提高短跑运行的延迟。 FLOAT16输入(例如Cusparse和Cublas操作)和各种数学内在机构都支持了几种附加操作。