浅谈VTune(TM) Performance Analyzer性能分析 以及与Intel(R) Thread Profiler的异同

intel_zhenyuwang intel_zhenyuwang 墨衍会员 · AI 创作全网分发 墨衍智能分发 通过墨衍一键同步至各平台 可同步平台 CSDN微信公众号微博知乎掘金百家号博客园抖音小红书 你的文章也可以这样分发 墨衍会员 ¥399起/年,写一次发全网 我也要 + 加入社区
Intel(R) VTune(TM) Performance Analyzer 提供了强大的性能分析功能,包含了进程报告图,线程报告图,模块报告图,热点报告图。可以层层分析,把性能问题的原因直指源代码。与Intel(R) Thread Profiler不同的是,VTune 不包含某些性能数据,如程序的并行度,同步变量的开销及与相关线程的关联,等。而Thread Profiler也不具备VTune的热点报告,及在源代码上与处理器架构相关性能分析.

然而,在有些功能上却有异曲同工之妙.

以下是计算Pi的四种方法(串行,传统的WinThread并行,OpenMP, TBB)的代码:
#include <windows.h>
#include <stdio.h>
#include <iostream>
#include <time.h>
#include <omp.h>

#include "tbb/task_scheduler_init.h"
#include "tbb/parallel_for.h"
#include "tbb/blocked_range.h"
#include "tbb/spin_mutex.h"
#include "tbb/tick_count.h"

const int num_steps = 100000000;
const int num_threads = 4; // My laptop is T61
double step = 0.0, pi = 0.0;

static tbb::spin_mutex myMutex;
static CRITICAL_SECTION cs;

void Serial_Pi()
{
double x, sum = 0.0;
int i;

step = 1.0/(double) num_steps;
for (i=0; i< num_steps; i++){
x = (i+0.5)*step;
sum = sum + 4.0/(1.0 + x*x);
}
pi = step * sum;
}


DWORD WINAPI threadFunction(LPVOID pArg)
{
double partialSum = 0.0, x; // local to each thread
int myNum = *((int *)pArg);

for ( int i=myNum; i<num_steps; i+=num_threads ) // use every num_threads step
{
x = (i + 0.5f) / num_steps;
partialSum += 4.0f / (1.0f + x*x); //compute partial sums at each thread
}

EnterCriticalSection(&cs);
pi += partialSum * step; // add partial to global final answer
LeaveCriticalSection(&cs);

return 0;
}

void WinThread_Pi()
{
HANDLE threadHandles[num_threads];
int tNum[num_threads];

InitializeCriticalSection(&cs);
step = 1.0 / num_steps;
for ( int i=0; i<num_threads; ++i )
{
tNum[i] = i;
threadHandles[i] = CreateThread( NULL, // Security attributes
0, // Stack size
threadFunction, // Thread function
(LPVOID)&tNum[i],// Data for thread func()
0, // Thread start mode
NULL); // Returned thread ID
}
WaitForMultipleObjects(num_threads, threadHandles, TRUE, INFINITE);

}

void OpenMP_Pi()
{
double x, sum=0.0;
int i;

step = 1.0 / (double)num_steps;

omp_set_num_threads(4);
#pragma omp parallel for private (x) reduction(+:sum) //schedule(static,4)

for (i=0; i<num_steps; i++)
{
x = (i + 0.5)*step;
sum = sum + 4.0/(1. + x*x);
}

pi = sum*step;

}

class ParallelPi {

public:

void operator() (tbb::blocked_range<int>& range) const {
double x, sum = 0.0;
for (int i = range.begin(); i < range.end(); ++i) {
x = (i+0.5)*step;
sum = sum + 4.0/(1.0 + x*x);
}
tbb::spin_mutex::scoped_lock lock(myMutex);
pi += step * sum;
}
};

void TBB_Pi ()
{
step = 1.0/(double) num_steps;
parallel_for (tbb::blocked_range<int> (0, num_steps), ParallelPi(), tbb::auto_partitioner());
}

int main()
{

clock_t start, stop;

// Coputing pi by using serial code
pi = 0.0;
start = clock();
Serial_Pi();
stop = clock();
printf ("Computed value of Pi by using serial code: %12.9f\n", pi);
printf ("Elapsed time: %.2f seconds\n", (double)(stop-start)/1000.0);

// Computing pi by using Windows Threads
pi = 0.0;
start = clock();
WinThread_Pi();
stop = clock();
printf ("Computed value of Pi by using WinThreads: %12.9f\n", pi);
printf ("Elapsed time: %.2f seconds\n", (double)(stop-start)/1000.0);

// Computing pi by using OpenMP
pi = 0.0;
start = clock();
OpenMP_Pi();
stop = clock();
printf ("Computed value of Pi by using OpenMP: %12.9f\n", pi);
printf ("Elapsed time: %.2f seconds\n", (double)(stop-start)/1000.0);

// Computing pi by using TBB
pi = 0.0;
start = clock();
tbb::task_scheduler_init tbb_init;
TBB_Pi();
stop = clock();
printf ("Computed value of Pi by using TBB: %12.9f\n", pi);
printf ("Elapsed time: %.2f seconds\n", (double)(stop-start)/1000.0);

return 0;
}

我们可以在VTune的进程报告中知道"Pi"进程的总体性能, 看5楼图一.


观察"Pi"进程的线程报告时,我们无法知道具体线程对应那些相应的工作, 看5楼图二.

但是我们可以选中所有的线程,使用Sampling Overtime View (SOT),产生新的报告.根据时间图得知那些线程对应那些相应的工作. 看5楼图三

而这些结果是与Thread Profiler的结果是一致的.看下图.(说明:OpenMP的线程以阴影表示;TBB的线程仅以一条表示.) 看5楼图四

这里对源代码的深入分析就不再一一展开了.(VTune的线程至模块至代码;Thread Profiler的Critical Path, Transition, Source View)



图片请参考下面5楼,谢谢
...全文

相关推荐

使用Intel VTune Amplifier工具分析CTP热点

使用Intel VTune Amplifier工具分析了CTPII代交易主机front_idtp组件的热点,以不带流的方式启动,采集数据时长30min(期间无用户登录和交易请求),得到的热点如下图所示: 排名第1的是epoll_wait,这是易于理解的,因为front_idtp闲着无事,只好一直在监听端口,CTPII采用的I/O复用方式为epoll,该机制主要涉及三个函数:epoll_cre...

SPACEWHALE

X264的时耗分析(详) and 程序优化技术

测试环境测试环境:Intel Pentium4 3.00GHz  (双核cpu),开启超线程内存:    DDR 1.00G操作系统: Windows sever 2003 Enterprise Edition分析软件: Intel(R) VTune(TM) Performance Analyzer 8.0(评估版lic)编译软件: VC71+nasm0.98Bus Speed: 800MHz测试

fly1019

Intel Arc显卡LLM推理实战:LLM Scaler适配与GGUF模型部署指南

大语言模型推理部署通常依赖CUDA生态,而Intel GPU采用不同的底层计算接口。通过适配层技术,可将基于Transformer架构的模型移植到异构硬件平台。LLM Scaler作为关键适配组件,实现了上层框架调用到底层指令的转换,其技术价值在于打破硬件生态壁垒,提升资源利用率。在工程实践中,结合GGUF模型格式与量化技术,能在Intel Arc Pro系列显卡上实现稳定推理。本文以Intel Arc Pro B60/B70为例,详细解析环境配置、模型加载与性能调优全流程,为专业显卡的AI应用部署提供实践

weixin_33787529

29Linux基础命令详解——用户管理.docx

29Linux基础命令详解——用户管理

云计算练习生

科技服务机构如何通过数据分析增强服务竞争力?.docx

科易网基于40亿+科创知识图谱数据库,深度探索AI技术在技术转移、成果转化、技术经纪、知识产权、产业创新、科技招商等垂直领域的多样化应用场景,研究科技创新领域的AI+数智化解决方案,推动科技创新与产业创新智能化发展。

BIZKEEN
评论 19
收藏 已收藏
分享
返回顶部