主要内容

生成代码的GPU执行分析

方法为生成的CUDA®代码生成执行分析报告gpucoder.profile函数。

GPU Coder分析器运行一个软件在循环(SIL)执行,为生成的代码中的任务和内核生成执行时指标。的执行分析报告雾整改GPU Coder的例子。有关更多信息,请参见雾整改

第三方的先决条件

  • CUDA支持NVIDIA®GPU。

  • NVIDIA CUDA工具包和驱动程序。

  • NVIDIA Nsight™系统。有关编译器和库的支持版本的信息,请参见第三方硬件

  • 编译器和库的环境变量。有关设置环境变量,请参见设置必备产品2022世界杯八强谁会赢?

  • 本例的分析工作流依赖于NVIDIA访问GPU性能计数器的分析工具。从CUDA工具包v10.1中,NVIDIA将对性能计数器的访问限制为只允许管理用户访问。如需使GPU性能指标可被所有用户使用,请参见性能计数器的权限问题(NVIDIA)

验证GPU环境

要验证运行此示例所需的编译器和库是否已正确设置,请使用coder.checkGpuInstall函数。

envCfg = code . gpuenvconfig (“主机”);envCfg。BasicCodegen = 1;envCfg。安静= 1;coder.checkGpuInstall (envCfg);

雾校正算法

该算法首先对输入图像进行去雾处理,然后对图像进行对比度增强。该图显示了这两种操作的步骤。

这个例子使用一个模糊的RGB图像作为输入。为了实现去雾,该算法先估计图像的暗通道,然后根据暗通道计算航灯图,再使用滤波器对航灯图进行细化。恢复阶段通过从输入图像中减去细化的航空灯图来创建一个去雾图像。

然后,对比度增强阶段评估图像中强度值的范围,并使用对比度拉伸来扩大值的范围,使特征更加突出。

FogRectificationAlgorithm.png

类型fog_rectification.m
function [out] = fog_rectifier (input) %#codegen %版权所有2017-2019 The MathWorks, Inc. code .gpu.kernelfun;% restoreOut用于存储恢复的输出restoreOut = 0 (size(input),'double');%更改输入图像的精度级别为双输入= double(input)./255;从输入darkChannel = min(input,[],3);% diff_im作为各向异性扩散的输入输出变量diff_im = 0.9*darkChannel;Num_iter = 3;%二维卷积掩模的各向异性扩散hN = [0.0625 0.1250 0.0625;0.1250 0.2500 0.1250;0.0625 0.1250 0.0625];hN = double(hN); %% Refine dark channel using Anisotropic diffusion. for t = 1:num_iter diff_im = conv2(diff_im,hN,'same'); end %% Reduction with min diff_im = min(darkChannel,diff_im); diff_im = 0.6*diff_im ; %% Parallel element-wise math to compute % Restoration with inverse Koschmieder's law factor = 1.0./(1.0-(diff_im)); restoreOut(:,:,1) = (input(:,:,1)-diff_im).*factor; restoreOut(:,:,2) = (input(:,:,2)-diff_im).*factor; restoreOut(:,:,3) = (input(:,:,3)-diff_im).*factor; restoreOut = uint8(255.*restoreOut); restoreOut = uint8(restoreOut); %% % Stretching performs the histogram stretching of the image. % im is the input color image and p is cdf limit. % out is the contrast stretched image and cdf is the cumulative prob. % density function and T is the stretching function. p = 5; % RGB to grayscale conversion im_gray = im2gray(restoreOut); [row,col] = size(im_gray); % histogram calculation [count,~] = imhist(im_gray); prob = count'/(row*col); % cumulative Sum calculation cdf = cumsum(prob(:)); % finding less than particular probability i1 = length(find(cdf <= (p/100))); i2 = 255-length(find(cdf >= 1-(p/100))); o1 = floor(255*.10); o2 = floor(255*.90); t1 = (o1/i1)*[0:i1]; t2 = (((o2-o1)/(i2-i1))*[i1+1:i2])-(((o2-o1)/(i2-i1))*i1)+o1; t3 = (((255-o2)/(255-i2))*[i2+1:255])-(((255-o2)/(255-i2))*i2)+o2; T = (floor([t1 t2 t3])); restoreOut(restoreOut == 0) = 1; u1 = (restoreOut(:,:,1)); u2 = (restoreOut(:,:,2)); u3 = (restoreOut(:,:,3)); % Replacing the value from look up table out1 = T(u1); out2 = T(u2); out3 = T(u3); out = zeros([size(out1),3], 'uint8'); out(:,:,1) = uint8(out1); out(:,:,2) = uint8(out2); out(:,:,3) = uint8(out3); return

生成执行分析报告

要生成执行分析报告,请使用动态库(“dll”)构建类型。因为gucoder。profile函数只接受嵌入式Coder™配置对象,启用该选项可创建编码器。EmbeddedCodeConfig配置对象。

cfg = code .gpu config (“dll”“是”,真正的);cfg.GpuConfig.MallocMode =“离散”

运行gpucoder.profile默认阈值为0秒。如果生成的代码有很多CUDA API或内核调用,那么每个调用很可能只占总时间的一小部分。在这种情况下,设置一个低(非零)阈值以生成有意义的分析报告。不建议将执行次数值设置为非常低的数字(小于5),因为它不能生成典型执行概要文件的准确表示。

inputImage = imread(“foggyInput.png”);inputs = {inputImage};designFileName =“fog_rectification”;gpucoder.profile(designFileName, inputs,...“CodegenConfig”cfg,“阈值”0,“我会”10);
要终止执行:clear fog_rectification_sil执行分析数据可供查看。打开模拟数据检查器。终止后可获得执行分析报告。主机应用程序产生以下标准错误(stderr)消息:警告:该平台不支持LBR回溯方法。将使用DWARF回溯方法。收集数据……###停止“fog_corrected”的SIL执行

的代码执行分析报告fog_rectification函数

代码执行分析报告根据从SIL执行中收集的数据提供指标。执行时间是从添加到SIL或PIL测试工具或在为每个组件生成的代码中记录的仪器探针的数据计算出来的。有关更多信息,请参见视图执行次数(嵌入式编码)

这些数字具有代表性。实际的值取决于您的硬件设置。该分析是在一台6核3.5GHz Intel®Xeon®CPU和NVIDIA TITAN XP GPU的机器上使用MATLAB R2022b完成的

总结

本节提供关于创建报表的信息。

代码的概要部分

此部分包含关于分析代码部分的信息。该报告包含以下方面的时间测量:

  • entry_point_fn_initialize比如函数,fog_rectification_initialize

  • 例如,入口点函数,fog_rectification

  • entry_point_fn_terminate比如函数,fog_rectification_terminate

  • section列列出生成代码的函数的名称。

  • 最大执行时间是代码段开始和结束之间的最长时间。

  • 平均执行时间是代码段开始和结束之间的平均时间。

  • Maximum Self Time是最大执行时间,不包括子段的时间。

  • Average Self Time是平均执行时间,不包括子节的时间。

  • Calls表示对代码部分的调用次数。

  • 要在“命令窗口”中查看代码部分的执行时间指标,请在相应的行中单击图标icon_view_code_sect_obj.png

  • 要显示测量的执行时间,单击模拟数据检查器图标icon_simulation_data_inspectora5cc10a7e5374a15280c4ca6011f26f9.png.您可以使用模拟数据检查器来管理和比较来自不同执行的图。

  • 要显示执行时间分布,请单击图标code_exec_profiling_report_icon_frequency_distribution.png

默认情况下,报告以毫秒为单位显示时间( 10 - 3. 秒)。您可以指定时间单位和数字显示格式。例如,要以微秒为单位显示时间( 10 - 6 秒),使用报告(嵌入式编码)命令:

executionProfile = getCoderExecutionProfile (“fog_rectification”);报告(executionProfile,...“单位”“秒”...“ScaleFactor”“1 e-06”...“NumericFormat”' % 0.3 f '
ans = '/local-ssd/lnarasim/MATLAB/ExampleManager/lnarasim. bdoc22b .j1984243/ gucoder -ex87489778/codegen/dll/ fog_correct_html / orphated /ExecutionProfiling_f31bfb52dfefde93.html'

只有当计时器被校准时,报告才会以秒为单位显示时间,也就是说,每秒的计时器滴答数是已知的。在Windows®机器上,软件为SIL模拟确定这个值。在Linux®机器上,必须手动校准计时器。例如,如果你的处理器速度是3.5 GHz,请指定每秒计时器滴答的次数:

executionProfile。TimerTicksPerSecond = 3.5e9;

执行时间(百分比)

本节提供了函数执行时间占调用方函数和总执行时间的百分比,这可以帮助您识别生成代码中的性能瓶颈。

GPU Profiling Trace for fog_corrected

第4节展示了运行时高于阈值的GPU调用的完整跟踪。这里显示了概要分析跟踪的一个片段。

fog_correction的GPU分析总结

报告中的第5节展示了第4节中所示的GPU调用的摘要。的cudaFree每运行一次调用15次fog_rectification15次呼叫的平均时间cudaFree超过9次fog_rectification是1.3790毫秒。这个摘要按所花费的时间降序排列,以便让用户了解哪个GPU调用花费的时间最长。

定义

本节提供一些指标的描述。

Baidu
map