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 并行化的结果非常差。我只是在猜测发生了什么:为了确认这一点,您可以考虑使用低级分析器。
我想在我的代码的某个位置调用 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 并行化的结果非常差。我只是在猜测发生了什么:为了确认这一点,您可以考虑使用低级分析器。