主要内容

gpucoder.reduce

优化GPU实现还原操作

自从R2019b

描述

例子

年代= gpucoder.reduce (一个,有趣的)骨料的值出现在输入数组一个使用给定的函数处理单个值有趣的。输出年代是一个标量。

年代= gpucoder.reduce (一个,{@FUN1, @FUN2,…})接受一个输入数组和函数处理的单元阵列。它聚集输入数组中所有值一个值为每一个函数处理单元阵列中提供。输出的大小是1)×(N,其中N是函数处理的数量。

代码生成器使用洗牌intrinsic GPU执行有效的减少。多个函数句柄并集成到一个单一内核在GPU上。

例子

全部折叠

这个示例中生成CUDA®代码找到元素的总和和最大的一个数组。

在一个文件中,写一个入口点函数multireduce接受一个矩阵输入一个。使用gpucoder.reduce函数执行两种类型的还原操作的元素一个

函数s = multireduce (A) s = gpucoder。减少(A, {@mysum, @mymax});结束函数c = mysum (a, b) c = a + b;结束函数c = mymax (a, b) c = max (a, b);结束

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

codegen配置coder.gpuConfig(墨西哥人)arg游戏{兰德(1024,“双”)}报告multireduce

下面是生成的代码的一个片段。

…cudaMalloc (&gpu_s 16妳);cudaMalloc (&gpu_A, 8192妳);cudaMemcpy (gpu_A (void *)和[0],8192妳,cudaMemcpyHostToDevice);multireduce_kernel1 < < < dim3 (1 u, 1 u, 1 u), dim3 (32 u, 1 u, 1 u) > > > (* gpu_A, * gpu_s);coder_reduce0 < < < dim3 (2 u, 1 u, 1 u), dim3 (512 u, 1 u, 1 u) > > > (* gpu_A, * gpu_s);cudaMemcpy(郑清奎[0]gpu_s 16妳,cudaMemcpyDeviceToHost);…静态__inline__ __device__ real_T shflDown2 (real_T in1, uint32_T抵消,uint32_T面具){int2 tmp;tmp = * (int2 *)三机一体; tmp.x = __shfl_down_sync(mask, tmp.x, offset); tmp.y = __shfl_down_sync(mask, tmp.y, offset); return *(real_T *)&tmp; } ...

输入参数

全部折叠

输入数组执行还原操作。代码生成的输入必须是数字或逻辑数据类型的数组。

处理一个用户定义的函数。有趣的也可以是单元阵列的处理函数。函数句柄是一个二元函数,必须满足以下要求:

  • 接受两个输入,并返回一个输出。函数的输入和输出的类型必须匹配输入数组的类型一个

  • 函数必须交换和关联,否则行为是未定义的。

名称-值参数

指定可选的双参数作为Name1 = Value1,…,以=家,在那里的名字参数名称和吗价值相应的价值。名称-值参数必须出现在其他参数,但对的顺序无关紧要。

R2021a之前,用逗号来分隔每一个名称和值,并附上的名字在报价。

例子:gpucoder.reduce(A, {@mySum, @myMax},'dim',2);

减少执行沿着指定的尺寸

例子:gpucoder.reduce(A, {@mySum, @myMax},'dim',2);

应用一个预处理函数输入数组的元素之前执行还原操作。

例子:gpucoder.reduce (@mySum,预处理,@myScale);

输出参数

全部折叠

减少操作的结果。在减少,年代初始化的值输入数组的一个元素一个。然后,减少操作是通过应用来执行的有趣的中每一个元素一个年代

限制

  • gpucoder.reduce不支持输入复杂数据金宝app类型的数组。

  • 用户定义的函数必须接受两个输入,并返回一个输出。函数的输入和输出的类型必须匹配输入数组的类型一个

  • 用户定义的函数必须交换和关联,否则行为是未定义的。

  • 一些输入的整数数据类型,生成的代码可能包含中间计算达到饱和。在这种情况下,生成的代码可能不匹配的结果从MATLAB仿真结果®

版本历史

介绍了R2019b