主要内容

分析生成的CUDA代码的性能

这个例子向您展示了如何分析和优化的性能产生CUDA®代码通过使用gpuPerformanceAnalyzer函数。

GPU编码器性能分析仪运行software-in-the-loop (SIL)执行收集指标CPU / GPU活动生成的代码并提供一个实足的时间表阴谋可视化识别和减轻CUDA代码生成的性能瓶颈。这个示例生成的性能分析报告雾整改GPU编码器的例子。有关更多信息,请参见雾整改

第三方的先决条件

  • CUDA NVIDIA GPU®启用。

  • NVIDIA CUDA工具包和司机。

  • 英伟达Nsight™系统。信息的支持版本的编译器和库,明白了金宝app第三方硬件

  • 环境变量的编译器和库。设置环境变量,看到设置必备产品下载188bet金宝搏

  • 本例的分析工作流取决于NVIDIA GPU访问性能计数器的分析工具。从CUDA工具包v10.1, NVIDIA限制访问性能计数器只有管理员用户。让GPU性能计数器被所有用户使用,见提供的指令许可问题性能计数器(英伟达)

验证GPU环境

验证所需的编译器和库运行这个示例设置正确,使用coder.checkGpuInstall函数。

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

雾矫正算法

改善雾蒙蒙的输入图像,该算法执行除雾然后对比度增强。图中显示了这两种操作的步骤。

这个例子需要一个雾蒙蒙的RGB图像作为输入。执行除雾,该算法估计图像的暗通道,计算空气光映射基于黑暗的通道,并改进空气光映射通过使用过滤器。恢复阶段创建一个除雾图像减去精制空气光从输入图像地图。

然后,对比度增强阶段评估的范围在图像强度值,并使用对比度拉伸值的范围扩大,使功能更清楚地脱颖而出。

FogRectificationAlgorithm.png

类型fog_rectification.m
函数[出]= fog_rectification(输入)% # codegen % 2017 - 2019版权MathWorks, inc . coder.gpu.kernelfun;% restoreOut用于存储的输出恢复restoreOut = 0(大小(输入),“双”);%改变输入图像的精度水平双输入=(输入)的两倍。/ 255;% %黑暗信道估计从输入darkChannel = min(输入,[],3);% diff_im作为输入和输出变量用于各向异性扩散diff_im = 0.9 * darkChannel;num_iter = 3;% 2 d卷积面具各向异性扩散hN = (0.0625 0.1250 0.0625;0.1250 0.2500 0.1250;0.0625 0.1250 0.0625);hN =双(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

生成性能分析报告

分析生成的代码使用的性能gpuPerformanceAnalyzer代码,创建一个配置对象动态库(“dll”)建造类型。因为gpuPerformanceAnalyzer函数只接受一个嵌入式编码器™配置对象,使选项创建一个coder.EmbeddedCodeConfig配置对象。

cfg = coder.gpuConfig (“dll”,“是”,真正的);

运行gpuPerformanceAnalyzer使用默认迭代数为2。

inputImage = imread (“foggyInput.png”);输入= {inputImage};designFileName =“fog_rectification”;gpuPerformanceAnalyzer (designFileName输入,“配置”cfg,“NumIterations”2);
# # #开始GPU代码生成代码生成成功:视图报告代码生成完成了# # # # # # GPU开始SIL执行“fog_rectification”终止执行:明确fog_rectification_sil # # #主机应用程序产生以下标准输出(stdout)消息:生成的/ tmp / nsys报告- 540 f。[1/1][0%]mw_nsysData qdstrm”。nsys-rep [1/1] [0%] mw_nsysData。nsys-rep [1/1] [= = = = = = = = = = = 50%) mw_nsysData。nsys-rep [1/1] [0%] mw_nsysData。nsys-rep [1/1] [7%] mw_nsysData。nsys-rep [1/1] [= = = = = = = = = = = 52%) mw_nsysData。nsys-rep [1/1] [= = = = = = = = = = = = = = = = = = = = = = = = 100%) mw_nsysData。nsys-rep [1/1] [= = = = = = = = = = = = = = = = = = = = = = = = 100%) mw_nsysData。nsys-rep生成:/home/lnarasim/Documents/MATLAB/ExampleManager / lnarasim.Bdoc23a.j2174901 / gpucoder-ex87489778 / mw_nsysData。nsys-rep # # #停止SIL执行“fog_rectification”# # # # # #开始分析数据处理分析数据处理完成了# # #显示分析数据

GPU性能分析器

GPU性能分析器暴露GPU和CPU活动,事件,和性能指标采用按时间顺序罗列工作时间表阴谋准确地想象,识别并解决性能瓶颈在生成的CUDA®代码。

ss11_1.png

这些数字是代表。实际值取决于你的硬件设置。这个分析是通过使用MATLAB R2023a的机器6核心,3.5 ghz Intel®Xeon®CPU、和NVIDIA GPU泰坦XP。

分析时间

分析时间线显示了完整的跟踪运行时的所有事件高于阈值。分析跟踪显示的一个片段。

ss12_1.png

您可以使用鼠标滚轮(或一个等价的触摸板选项)放大的时间表。或者,您可以使用面板的顶部的时间总结变焦和导航时间表阴谋。

每个事件的工具提示显示开始时间,结束时间和持续时间的选择事件的CPU和GPU。也表明之间的时间内核启动的CPU和GPU的实际执行内核。

事件统计

事件统计面板显示为选定的事件的额外信息。例如,fog_rectification_kernel1显示以下数据:

ss13.png

的见解

的见解面板提供了一个饼图概述GPU和CPU活动。饼图的变化根据缩放级别的分析时间。见解面板显示的一个片段。在该地区选择在时间轴上,它表明GPU利用率仅为16%。

ss14_1.png

调用树

本节列出了GPU事件从CPU。调用树中的每个事件列表调用函数的执行时间的百分比。这个指标可以帮助你识别性能瓶颈在生成的代码。你也可以导航到特定事件的分析时间轴通过点击相应的事件调用树。

过滤器

本节为该报告提供了过滤选项。

  • 视图模式——使用这个选项来查看分析结果为整个应用程序(包括初始化和终止)或设计功能(没有初始化和终止)。

  • 事件阈值——跳过事件小于给定的阈值。

  • 内存分配/自由-显示GPU设备内存分配和重分配CPU活动栏上的相关事件。

  • 内存传输——显示host-to-device和device-to-host内存传输。

  • 内核——显示CPU内核启动和GPU内核活动。

  • 其他人——显示其他GPU相关事件,如同步和等待GPU。

改善性能的雾整改

从性能分析报告,很明显,执行时间的很大一部分都花在内存分配和重分配。为了提高性能,你可以打开GPU内存管理器并再次运行分析。

cfg = coder.gpuConfig (“dll”);cfg.GpuConfig。EnableMemoryManager = true;gpuPerformanceAnalyzer (designFileName输入,“配置”cfg,“NumIterations”2);
# # #开始GPU代码生成代码生成成功:视图报告代码生成完成了# # # # # # GPU开始SIL执行“fog_rectification”终止执行:明确fog_rectification_sil # # #主机应用程序产生以下标准输出(stdout)消息:生成的/ tmp / nsys-report-18e6。[1/1][0%]mw_nsysData qdstrm”。nsys-rep [1/1] [0%] mw_nsysData。nsys-rep [1/1] [5%] mw_nsysData。nsys-rep [1/1] [= = = = = = = = = = = 51%) mw_nsysData。nsys-rep [1/1] [= = = = = = = = = = = = = = = = = = = = = = = = 97%) mw_nsysData。nsys-rep [1/1] [= = = = = = = = = = = = = = = = = = = = = = = = 100%) mw_nsysData。nsys-rep生成:/home/lnarasim/Documents/MATLAB/ExampleManager / lnarasim.Bdoc23a.j2174901 / gpucoder-ex87489778 / mw_nsysData。nsys-rep # # #停止SIL执行“fog_rectification”# # # # # #开始分析数据处理分析数据处理完成了# # #显示分析数据

ss15_1.png

另请参阅

功能

对象

相关的话题