- c - 在位数组中找到第一个零
- linux - Unix 显示有关匹配两种模式之一的文件的信息
- 正则表达式替换多个文件
- linux - 隐藏来自 xtrace 的命令
我问自己什么是衡量并行程序性能(以触发器为单位)的最佳方法。我读到了 papi_flops。这似乎适用于串行程序。但我不知道如何衡量并行程序的整体性能。
我想测量 blas/lapack 函数的性能,在我下面的 gemm 示例中。但我也想测量其他功能,特别是操作次数未知的功能。 (在 gemm 的情况下,ops 是已知的 (ops(gemm) = 2*n^3),因此我可以将性能计算为操作数和执行时间的函数。)库(我使用的是 Intel MKL) 自动生成线程。所以我无法单独测量每个线程的性能然后降低它。
这是我的例子:
#include <stdlib.h>
#include <stdio.h>
#include <string.h>
#include "mkl.h"
#include "omp.h"
#include "papi.h"
int main(int argc, char *argv[] )
{
int i, j, l, k, n, m, idx, iter;
int mat, mat_min, mat_max;
int threads;
double *A, *B, *C;
double alpha =1.0, beta=0.0;
float rtime1, rtime2, ptime1, ptime2, mflops;
long long flpops;
#pragma omp parallel
{
#pragma omp master
threads = omp_get_num_threads();
}
if(argc < 4){
printf("pass me 3 arguments!\n");
return( -1 );
}
else
{
mat_min = atoi(argv[1]);
mat_max = atoi(argv[2]);
iter = atoi(argv[3]);
}
m = mat_max; n = mat_max; k = mat_max;
printf (" Initializing data for matrix multiplication C=A*B for matrix \n"
" A(%ix%i) and matrix B(%ix%i)\n\n", m, k, k, n);
A = (double *) malloc( m*k * sizeof(double) );
B = (double *) malloc( k*n * sizeof(double) );
C = (double *) malloc( m*n * sizeof(double) );
printf (" Intializing matrix data \n\n");
for (i = 0; i < (m*k); i++)
A[i] = (double)(i+1);
for (i = 0; i < (k*n); i++)
B[i] = (double)(-i-1);
memset(C,0,m*n*sizeof(double));
// actual meassurment
for(mat=mat_min;mat<=mat_max;mat+=5)
{
m = mat; n = mat; k = mat;
for( idx=-1; idx<iter; idx++ ){
PAPI_flops( &rtime1, &ptime1, &flpops, &mflops );
cblas_dgemm(CblasColMajor, CblasNoTrans, CblasNoTrans,
m, n, k, alpha, A, k, B, n, beta, C, n);
PAPI_flops( &rtime2, &ptime2, &flpops, &mflops );
}
printf("%d threads: %d in %f sec, %f MFLOPS\n",threads,mat,rtime2-rtime1,mflops);fflush(stdout);
}
printf("Done\n");fflush(stdout);
free(A);
free(B);
free(C);
return 0;
}
这是一个输出(矩阵大小为 200):
1 threads: 200 in 0.001459 sec, 5570.258789 MFLOPS
2 threads: 200 in 0.000785 sec, 5254.993652 MFLOPS
4 threads: 200 in 0.000423 sec, 4919.640137 MFLOPS
8 threads: 200 in 0.000264 sec, 3894.036865 MFLOPS
对于执行时间,我们可以看到函数 gemm 是按比例缩放的。但是我正在测量的触发器只是线程 0 的性能。
我的问题是:如何衡量整体表现?我很感激任何输入。
最佳答案
首先,我很好奇 - 为什么需要 FLOPS?你不关心花了多少时间吗?或者与其他 BLAS 库相比花费的时间?
PAPI 是基于线程的,它本身在这里没有多大帮助。
我要做的是围绕函数调用进行测量,看看时间如何随着它产生的线程数而变化。它不应产生比物理内核更多的线程(HT 在这里不好)。然后,如果矩阵足够大,并且机器没有加载,时间应该简单地除以线程数。例如,4 核上的 10 秒应该变为 2.5 秒。
除此之外,您还可以做两件事来真正衡量它:
1. 使用你现在使用的任何东西,但在 BLAS 代码周围注入(inject)你的开始/结束测量代码。一种方法(在 Linux 中)是通过预加载定义 pthread_start 的库并使用您自己的函数来调用原件但进行一些额外的测量。另一种在进程已经运行时覆盖函数指针的方法(=蹦床)。在 linux 中它在 GOT/PLT 中,在 windows 中它更复杂 - 寻找一个库。
2. 使用 oprofile 或其他分析器报告在您关心的时间内执行的指令数。或者更好的是,报告执行的浮点指令数。一个小问题是 SSE 指令一次乘以或加 2 个或更多 double ,所以你必须考虑到这一点。我猜你可以假设他们总是使用最大可能的操作数。
关于c - 如何衡量并行程序的整体性能(使用papi),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31701676/
我正在阅读Head First Design Patterns一书,在第382页上说: Composite Patterns is used when you have collection of o
我将我的电脑用作 wifi 热点,并将其他设备连接到它。然后使用wireshark,我可以看到特定设备上发送/接收的数据包,但是我怎样才能看到设备正在查看的完整网页而不是单独的数据包? 最佳答案 尝试
在 URL 中打开我的 Jenkins 时,我似乎无法登录它会抛出消息“用户缺少整体/读取权限”。我试过answer来自类似的问题,但禁用安全性不起作用。 Jenkins 继续抛出错误。有人建议我一起
我已经使用工具分配测试了我的应用程序并得到了这张图片: 如图所示,我的应用程序正常工作,但它通常以总字节数计值吗?我担心“#Allocations (Net/Overall)”,因为它的颜色是红色。这
我遵循教程 Deployment on Tomcat without modification of monitored webapps (beta) .监控站点正在运行,我可以看到统计页面。问题是
所以我有一个 div,其中整个东西都是一个 anchor 标记,我试图控制颜色在悬停时的显示方式并获得不同的结果。希望我能用 CSS 做到这一点。发生的事情是悬停,一个文本发生变化,但另一个没有。但是
我创建了一个程序,您可以在其中输入行驶的英里数和每 jar 油使用的加仑数,该程序会显示每 jar 油的 mpg。我使用的是 Visual Studio 2010。当我输入标记值 -1 时,系统会给出
我有一个由 N 个节点组成的 zookeeper 集群(彼此了解)。如果我在 zk 客户端连接字符串中只传递 M < N 个节点地址怎么办?集群的行为是什么? 在更具体的情况下,如果我只从集群中传递
我一直在试图弄清楚当使用诸如 pushViewController:animated、presentModalViewController:animated 和 UITabBarViewControl
我已经在 VIM 中安装了 minikube,并且我拥有具有所有权限的服务帐户 token 。是否有来自 kubernetes 的 API 来获取资源使用情况(总体)。 最佳答案 要获取 CPU 和内
如何通过 HTTP 客户端(例如 CURL、Insomnia、Postman 等)快速使用使用 JWT token 的 JHipster 生成的应用程序? 最佳答案 嗯,我研究了一段时间,发现你必须遵
我是一名优秀的程序员,十分优秀!