主要内容

coder.gpu.kernel

编译指示映射-循环到GPU内核

描述

coder.gpu.kernel ()是一个循环级的注释,必须放在for循环的前面。它生成一个具有从循环参数计算出的维度的内核。

请注意

coder.gpu.kernelPragma覆盖了软件执行的所有并行循环分析检查。使用coder.gpu.kernelfun在使用更高级的功能之前coder.gpu.kernel编译指示。

coder.gpu.kernel (B、T)是一个循环级的注释,必须放在for循环的前面。它生成内核,其中尺寸指定BTB (Bx, 1)是一个数组,在网格中定义块的数量沿维xy(z不曾用过)。T (Tx,泰,Tz)是一个沿维度定义块中线程数的数组吗x,y, 和z

for的值为-1BT表示GPU Coder™必须自动推断网格和块的尺寸。的coder.gpu.kernelPragma为无效网格和块尺寸生成错误。

例子

coder.gpu.kernel (B T M,名称)预计相同BT参数。您可以指定可选参数的名字是一个正整数,指定每个流多处理器的最小块数。有时,增加可以减少内核内的寄存器使用,并改进内核占用。for的值为-1表示GPU编码器必须使用默认值1。的名字是一个字符数组,允许您自定义生成的内核的名称。

指定内核注释会覆盖所有并行循环分析检查。在并行循环分析无法证明所有迭代都是相互独立的情况下,这种重写允许并行化循环。首先,确保循环的并行化是安全的。

此功能是代码生成函数。它在matlab中没有任何影响®

例子

全部折叠

控件的使用方法内核在函数中生成CUDA®代码。

在一个文件中,编写入口点函数标量接受两个矢量输入x, y大小1x4096和一个标量输入规模。函数有两个- 不同的迭代长度,一个用于向量添加,一个用于查找累积和。把coder.gpu.kernel(1,1024)Pragma在第一圈外。这个pragma创建了一个具有1024个线程的块的内核。把coder.gpu.kernel(8512512年,“还原”)第二循环外的pragma。此Pragma创建一个内核,每个内核每块具有512个线程。为此块创建的内核被命名为Rexing。

功能[vout, sout1] = scalars(x,y,scale) sout1 = 0;输出电压= coder.nullcopy(0(大小(x)));coder.gpu.kernel (1024);i = 1:1024 VOUT(i)= x(i)+ y(i);结束coder.gpu.kernel (8512512“还原”);i = 1:4096 Sout1 =(x(i)*比例)+ sout1;结束结束

使用codegen函数生成CUDA MEX函数。

codegen配置coder.gpuconfig('mex')arg游戏{1(1, 4096,“双”)的(1,4096,“双”),coder.typeof (0)}-报告标量

GPU Coder创建两个内核:scalars_kernel1.对于向量加法和scalarsreduction累积和的核。初始化不需要内核sout1 = 0

cudaMemcpy(gpu_y, y, 32768U, cudaMemcpyHostToDevice);cudaMemcpy(gpu_x, x, 32768U, cudaMemcpyHostToDevice);scalars_kernel1<< dim3(1U, 1U, 1U), dim3(1024U, 1U, 1U)>>>(gpu_y, gpu_x, gpu_vout);cudaMemcpy(gpu_sout1, sout1, 8U, cudaMemcpyHostToDevice);scalarsreduction<<>>(scale, gpu_x, gpu_sout1);cudaMemcpy(vout, gpu_vout, 32768U, cudaMemcpyDeviceToHost);cudaMemcpy(sout1, gpu_sout1, 8U, cudaMemcpyDeviceToHost);

scalars_kernel1.有一个块,每个块有1024个线程,一个用于添加每个元素。scalarsreduction内核有8个块,每个块有512个线程,因此总共有4096个线程。

在指定内核维度时,可以使用变量或表达式。例如,您可以重写标量入口点函数,使得网格和块尺寸在编译时指定。

功能[Vout,Sout1] = Scalars(x,y,scale,a,b)sout1 = 0;vout = zeros(尺寸(x));coder.gpu.kernel (1024);i = 1:1024 VOUT(i)= x(i)+ y(i);结束coder.gpu.kernel([a,a * b,1],[a * b,1,1],“还原”);i = 1:长度(x)sout1 =(x(i)*比例)+ sout1;结束结束

使用codegen函数生成CUDA MEX函数。

codegen配置coder.gpuconfig('mex')arg游戏{1(1, 4096,“双”)的(1,4096,“双”),20日8日4}-报告标量
介绍了R2017b