主要内容

coder.gpu.kernelfun

将函数映射到GPU内核的Pragma

描述

例子

coder.gpu.kernelfun ()是一个全局级的pragma,它试图将函数内的所有计算映射到GPU上。这个函数中的循环只有通过了并行循环分析检查才会被并行化为GPU内核。这个分析试图证明每个循环迭代是相互独立的。

这个pragma不需要任何输入参数。它生成基于循环参数自动计算尺寸的内核。

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

例子

全部折叠

方法的使用kernelfun在函数中使用pragma生成CUDA®代码。

在一个文件中,编写入口点函数标量它接受两个向量输入x, y的大小1 x4096一个标量输入规模.这个函数有两个-不同迭代长度的循环,一个用于向量加法,一个用于求累积和。把coder.gpu.kernelfun ()语言的Pragma标量函数。

函数[vout, sout1] = scalars(x,y,scale) code .gpu.kernelfun;Sout1 = 0;Vout = code .nullcopy(0 (1,1024));vout(I) = x(I) + y(I);结束I =1:4096 sout1 = (x(I)*scale) + sout1;结束结束

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

codegen配置coder.gpuConfig(墨西哥人)...arg游戏{1(1, 4096,“双”)的(1,4096,“双”),coder.typeof (0)}...报告标量

GPU Coder创建三个内核:scalars_kernel1初始化sout1 = 0scalars_kernel2对于向量加法,和scalars_kernel3是累积和的约简核。

scalars_kernel1<<>>(gpu_sout1);cudaMemcpy(gpu_y, y, 32768U, cudaMemcpyHostToDevice);cudaMemcpy(gpu_x, x, 32768U, cudaMemcpyHostToDevice);scalars_kernel2<<>>(gpu_y, gpu_x, gpu_vout);scalars_kernel3<<>>(scale, gpu_x, gpu_sout1);cudaMemcpy(vout, gpu_vout, 32768U, cudaMemcpyDeviceToHost);cudaMemcpy(sout1, gpu_sout1, 8U, cudaMemcpyDeviceToHost);

scalars_kernel2有两个块,每个块有512个线程,共1024个线程,每个线程用于添加每个元素。同样的,scalars_kernel3有8个块,每个块有512个线程,总共有4096个线程。GPU编码器还执行了一个优化,最大限度地减少的数量cudamMemcpy函数调用。在本例中,是输入的副本x在GPU中,没有额外的cudamMemcpy之间的要求scalars_kernel2而且scalars_kernel3.除了内存优化,内核之间的任何顺序代码都被映射到CUDA线程上,以将数据保存在GPU上。

版本历史

在R2017b中引入