多线程OpenBlas降低性能



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

问题是,我想评估基于不同线程的多线程cblas_dgbmv的性能,通过使用一个循环,连续调用这个函数1000次并测量时间。我的驱动程序是顺序的。然而,即使是2线程的dgbmv也会降低性能(执行时间),因为它是一个单一的多线程调用,没有循环。

我研究了OpenBLAS的多线程运行,并确保一切都符合规范。在我的驱动程序中没有线程生成或任何pragma指令(它只运行一个主线程只是为了测量时钟)。换句话说,我在顺序区域调用DGBMV,而不是与OpenBLAS的线程冲突。然而,我感觉有太多的线程正在运行,因此执行速度变慢,尽管我已经将所有关于#threads的env变量(除了OPENBLAS_NUM_THREADS)设置为1。

我使用openmp wall clock时间,并使用仅围绕这个1000次调用者循环的代码来测量执行时间,因此这也很好:

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 args…)。下面是编译库和应用程序的Makefile:

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的多线程版本出了什么问题,我将非常高兴。

在我自己的可伸缩性很好的程序中(与上面提到的多线程openblas不同),我尝试将GOMP_CPU_AFFINITY设置为0..为了在没有超线程的情况下在前8个cpu(或内核)上运行8个线程,将PROC_BIND设置为true,并将OMP_PLACES设置为threads(8)。然后,我通过htop实用程序直观地检查了每个线程都在具有8个处理器的第一个numa节点上执行。在确保之后,结果是5秒。通过取消这些变量,我得到了快5秒的结果。@JeromeRichard。我也会在openblas驱动程序上尝试同样的事情。

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

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

屏幕截图

相关内容

  • 没有找到相关文章

最新更新