主要内容

coder.gpu.nokernel

编译指示禁用内核创建循环

描述

例子

coder.gpu.nokernel ()是一个循环水平编译指示,当立即放置在for循环防止代码生成器生成CUDA吗®内核在循环的语句。这个编译指示不需要任何输入参数。

这个函数是一个代码生成函数。在MATLAB它没有效果®

例子

全部折叠

这个例子展示了如何使用nokernel编译指示在一个函数中,防止代码生成器生成CUDA的内核在循环语句

在一个文件中,写的入口点函数nestedLoop接受两个向量输入A、B的大小32 x512。有两个嵌套的函数不同的迭代长度的循环,一个用于操作沿着列和一个用于沿行操作。第一个嵌套循环计算两个向量的和输入而第二个嵌套循环尺度是由三个因素造成的。

函数[C] = nestedLoop (A, B) G = 0 (512);C = 0 (512);coder.gpu.kernelfun ();%这个嵌套循环将融合i = 1时32分j = 1:512 G (i, j) = (j) + B (j);结束结束coder.gpu.nokernel ();i = 1时32分j = 1:512 C (i, j) = G (i, j) * 3;结束结束结束

使用codegen函数来生成CUDA墨西哥人的功能。

cfg = coder.gpuConfig (墨西哥人的);cfg。GenerateReport = true;codegen配置cfgarg游戏{的(1512年,“双”)的(1512年,“双”)}nestedLoop

GPU编码器创建两个内核:nestedLoop_kernel1执行计算G (i, j) = (j) + B (j);第一个嵌套循环nestedLoop_kernel2内核执行计算C (i, j) = G (i, j) * 3;的第二个嵌套循环。创建第二个内核的内部循环嵌套循环。的noKernel编译指示只适用于循环立即声明。片段显示生成的内核。

静态__global__ __launch_bounds__(512 1)空白nestedLoop_kernel1 (const real_T B [512], const real_T [512], [16384] real_T G) {uint32_T threadId;…如果(我< 32){G (i + (j < < 5)] = [j] + B [j];}}静态__global__ __launch_bounds__(512 1)空白nestedLoop_kernel2 (real_T G [16384], int32_T我real_T C [16384]) {uint32_T threadId;…;如果(< 512){C (i + (j < < 5)] = [i + G (< < 5)) * 3.0;}

主要功能的片段显示,代码生成器融合了第一个嵌套循环的内核启动参数。正如前面提到的,第二的外循环嵌套循环是不映射到内核。因此代码生成器的地方for循环声明之前调用第二个CUDA内核nestedLoop_kernel2

空白nestedLoop (const real_T [512], const real_T B [512], real_T C [16384]) {int32_T我;…/ /这两个循环将熔融cudaMemcpy (gpu_B, (void *)乙[0],4096 ul, cudaMemcpyHostToDevice);cudaMemcpy (gpu_A (void *)和[0],4096 ul, cudaMemcpyHostToDevice);nestedLoop_kernel1 < < < dim3 (32 u, 1 u, 1 u), dim3 (512 u, 1 u, 1 u) > > > (* gpu_B, * gpu_A, * gpu_G);(我= 0;我< 32;我+ +){nestedLoop_kernel2 < < < dim3 (1 u, 1 u, 1 u), dim3 (512 u, 1 u, 1 u) > > > (* gpu_G, * gpu_C);C_dirtyOnGpu = true;}…… cudaFree(*gpu_C); }
介绍了R2019a