MKL:未能观察到穿线的效果

MKL: failed to observe the effect of threading

我想在我的代码的某个位置调用 cblas_drot,该位置不在并行区域中。然后我很困惑,这个调用的执行时间在单线程模式和24线程下基本相同。我在函数调用之前通过 mkl_set_num_threads() 设置了线程数。有人知道会发生什么吗?

cpu 是 2*Xeon E5 2620v3,OS 是 Ubuntu 16.04.2。

可能您正在使内存带宽饱和。该函数的计算强度非常低,性能主要取决于内存访问的时间。实际上,可扩展性结果在很大程度上取决于增量 incX 和 incY。假设 N = 10000000,我发现 (CPU E5-2670):

N threads |  time for incX=incY=1  | time for incX=incY=32
1         |  0.026271              |  1.243775
2         |  0.020599              |  0.555945
4         |  0.017871              |  0.301370
8         |  0.021367              |  0.152756
16        |  0.021729              |  0.175500

这表明当 incX/Y 不同于 1 时,加速高达 8 个线程(并且在 16 个线程时仍然存在)。当 incX/Y=1 时,一个非常好的优化该函数的版本(大量使用 AVX 函数)使用了可用内存带宽的主要部分,使得 OpenMP 并行化的结果非常差。我只是在猜测发生了什么:为了确认这一点,您可以考虑使用低级分析器。