gpt4 book ai didi

android - perf_event 用于进程中的多个线程

转载 作者:行者123 更新时间:2023-12-04 13:29:27 25 4
gpt4 key购买 nike

我正在尝试使用 perf 分析给定进程中的多个线程.尽管 pid 下面的代码确实出现了perf_event_open 的参数是 0 (这应该导致整个进程的概要分析?),硬件计数器值仅对应于执行线程(与进程内的线程相加的 perf 计数器)与 inf_loop不被计算在内。
我的问题是:如何分析进程中的所有线程与仅执行 perf_event_open 的线程?如下? perf_event_attr 中是否还有其他配置?需要设置为启用进程范围的分析?

static long perf_event_open(struct perf_event_attr *hw_event, pid_t pid,
int cpu, int group_fd, unsigned long flags)
{
int ret;
ret = syscall(__NR_perf_event_open, hw_event, pid, cpu,
group_fd, flags);
return ret;
}

static int fd;

void setup()
{
struct perf_event_attr pe;
memset(&pe, 0, sizeof(pe));
pe.type = PERF_TYPE_HARDWARE;
pe.size = sizeof(pe);
pe.config = PERF_COUNT_HW_INSTRUCTIONS;
pe.disabled = 1;
pe.exclude_kernel = 1;
pe.exclude_hv = 1;
pid_t pid = 0;
int cpu = -1;
fd = perf_event_open(&pe, pid, cpu, -1, 0);
if (fd == -1) {
fprintf(stderr, "Error opening leader %llx\n", pe.config);
exit(EXIT_FAILURE);
}
ioctl(fd, PERF_EVENT_IOC_RESET, 0);
ioctl(fd, PERF_EVENT_IOC_ENABLE, 0);
}

int64_t read()
{
int64_t count;
read(fd, &count, sizeof(count));
return count;
}

std::size_t k;

// The instruction counts do not reflect the cycles consumed here
void inf_loop()
{
k = 2;
volatile size_t *p = &k;
while (*p)
{
++k;
}
}

int main(int argc, char **argv)
{
setup();
thread t1(inf_loop);
int count = 0;
for (uint64_t idx = 0; idx < (1ULL << 54); ++idx)
{
if (idx % (1ULL << 32) == 0)
{
cout << "Cycles: " << read() << endl;
}
}
}

最佳答案

你要的是perf_event_attrinherit标志,它将子线程计数合并到父线程中。

关于android - perf_event 用于进程中的多个线程,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/65977980/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com