首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >多线程OpenBlas降低性能

多线程OpenBlas降低性能
EN

Stack Overflow用户
提问于 2022-06-21 16:35:40
回答 2查看 142关注 0票数 0

我有一个驱动程序cpp文件,它用适当的参数调用cblas_dgbmv函数。当我用"make“构建OpenBLAS时,dgbmv会自动运行8个线程(在gbmv.c接口中调用多线程dgbmv,并且假设这是默认行为)。相反,当我在此构建之后提供OPENBLAS_NUM_THREADS=1时,顺序版本会运行,一切都进行得很顺利。现在一切都好。

问题是,我想评估基于不同线程的多线程cblas_dgbmv的性能,方法是使用一个循环来连续调用这个函数1000次并测量时间。我的司机是顺序的。但是,即使是2个线程dgbmv也会降低性能(执行时间),这是一个没有循环的多线程调用。

我研究了OpenBLAS的多线程运行,确保了一切都符合规范。在我的驱动程序中没有线程生成或任何实用化指令(它只运行一个主线程来测量挂钟)。换句话说,我在顺序区域调用DGBMV,而不是与OpenBLAS的线程冲突。但是,我感觉到了这样的情况:过多的线程正在运行,因此执行速度减慢,不过,除了OPENBLAS_NUM_THREADS之外,我已经将所有关于#线程的env变量设置为1。

我使用openmp墙时钟时间,并使用只围绕这个1000次调用者循环的代码来度量执行时间,所以这也很好:

代码语言:javascript
复制
  double seconds,timing=0.0;
 //for(int i=0; i<10000; i++){
        seconds = omp_get_wtime ( );
        cblas_dgbmv(CblasColMajor, CblasNoTrans , n, n, kl, ku, alpha, B, lda, X, incx, beta, Y, incy);
        timing += omp_get_wtime ( ) - seconds;
   // }

我在运行时使用适当的env变量集(OPENBLAS_NUM_THREADS=4 ./myBinary .)运行驱动程序代码。下面是编译库和应用程序的Makefile:

代码语言:javascript
复制
myBinary: myBinary.cpp
    cd ./xianyi-OpenBLAS-0b678b1 && make USE_THREAD=1 USE_OPENMP=0 NUM_THREADS=4  &&  make PREFIX=/home/selin/HPC-Research/xianyi-OpenBLAS-0b678b1  install
    g++ myBinary.cpp -o myBinary -I/home/selin/HPC-Research/xianyi-OpenBLAS-0b678b1/include/ -L/home/selin/HPC-Research/xianyi-OpenBLAS-0b678b1/lib -Wl,-rpath,/home/selin/HPC-Research/xianyi-OpenBLAS-0b678b1/lib -lopenblas -fopenmp -lstdc++fs -std=c++17

架构: 64核共享内存与AMD Opteron处理器

如果有人能解释dgbmv的多线程版本出了什么问题,我将非常高兴。

EN

回答 2

Stack Overflow用户

发布于 2022-06-23 14:29:41

在我自己的扩展性很好的程序(不同于上面提到的多线程openblas )中,我尝试将GOMP_CPU_AFFINITY设置为0.8,将PROC_BIND设置为true,并将OMP_PLACES设置为OMP_PLACES(8),以便在前8个cpus (或核心)上运行8个线程,而不需要超线程。然后,我通过htop实用程序直观地检查了每个线程在第一个具有8个处理器的numa节点上执行的情况。在确保这一点之后,结果是5秒以上。通过取消这些变量,我得到了5秒更快的结果。@Jér meRichard。对于openblas驱动程序,I2ll也尝试了同样的方法。

票数 0
EN

Stack Overflow用户

发布于 2022-06-28 14:16:37

我刚刚尝试了在其他评论(我自己的openmp程序的设置)中为openblas编写的内容。我已经用make USE_OPENMP=1 (正如我说过的那样是一个顺序驱动程序)和num_threads=256构建了这个库来设置一个最大数量。在运行openblas多线程之后,htop显示运行在同一个numa节点(例如前8个核)中的多个线程,通过它我使用环境变量proc_bind=true安排并放置硬件线程。但是,即使是对多线程dgbmv的1次调用也比顺序调用(1个线程版本)慢。

此外,在我的系统中,多线程OpenBlas线程依次处于休眠和运行状态(尽管在我自己的openmp并行程序中,所有线程都处于运行状态),而且它们的CPU利用率很低,大约在60%左右。

htop截图

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/72704310

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档