为什么Qpar比OpenMP更快?

时间:2014-06-26 12:06:32

标签: windows multithreading benchmarking simd

我有一系列基准测试,通过CUDA,多线程和OpenMP进行相同的计算,目前正在通过Windows 8.1进行测试。线程程序需要MS Compiler Version 18.00 for x64,来自Visual Studio 2013,以产生完整的SIMD速度,但不适用于AVX。参见:

How can I improve performance compiling for SSE and AVX?

OpenMP版本通过早期的编译器产生了较慢的SISD速度(见上面的链接),但版本18.00没有改进。然后我发现了Qpar MS Auto-Parallelizer,它通过VS 2013生成全速SIMD。下面显示了一个测试循环,以及使用的pragma伪指令和编译选项。

#pragma  ??
for(i=0; i < n; i++)
{
   x[i] = (x[i]+a)*b-(x[i]+c)*d+(x[i]+e)*f;
}

OpenMP -  #pragma omp parallel for          Compile option /openmp
Qpar   -  #pragma loop(hint_parallel(4))    Compile option /Qpar

Qpar thread count has to be constant but program repeats caclculation
code with different count value for run time parameters 1, 2, 4, 8, 16
OpenMP uses /Affinity command to select 1 core (or more).   

具有10 MB L3缓存且运行速度为3.9 GHZ的四核i7 4820K的结果如下。 400 KB和4 MB测试主要通过L3缓存运行,但最大数据大小受RAM速度的影响。最大Qpar速度非常好,每个核心每个核心6.12 MFLOPS,最大值为8。

是否有其他编译选项或指令会强制OpenMP生成SSE SIMD指令?

Test           4 Byte   Ops/  Repeat   Seconds  MFLOPS     First    All
                Words   Word  Passes                     Results   Same

OpenMP         100000      8    2500  0.333250    6002   0.957117   Yes
1 Thread      1000000      8     250  0.325936    6136   0.995517   Yes
             10000000      8      25  0.327862    6100   0.999549   Yes

OpenMP         100000      8    2500  0.086657   23079   0.957117   Yes
4 Threads     1000000      8     250  0.082454   24256   0.995517   Yes
             10000000      8      25  0.083116   24063   0.999549   Yes


Qpar           100000      8    2500  0.081774   24458   0.957117   Yes
1 Thread      1000000      8     250  0.083037   24086   0.995517   Yes
             10000000      8      25  0.101802   19646   0.999549   Yes

Qpar           100000      8    2500  0.023911   83644   0.957117   Yes
4 Threads     1000000      8     250  0.020935   95535   0.995517   Yes
             10000000      8      25  0.050972   39237   0.999549   Yes

最初的Linux版本获得了与Windows类似的速度,但在Ubuntu 14.04下使用gcc 4.8.2重新编译提供了更快的结果,但不如Qpar。然后,gcc AVX选项弥补了差异。见下文:

All OpenMP Linux

Test           4 Byte   Ops/  Repeat   Seconds  MFLOPS     First    All
                Words   Word  Passes                     Results   Same

Old            100000      8    2500  0.326685    6122   0.957117   Yes
1 Thread      1000000      8     250  0.325421    6146   0.995517   Yes
             10000000      8      25  0.328084    6096   0.999549   Yes

Old            100000      8    2500  0.088871   22505   0.957117   Yes
4 Threads     1000000      8     250  0.085748   23324   0.995517   Yes
Data in & o  10000000      8      25  0.086515   23117   0.999549   Yes


New            100000      8    2500  0.151160   13231   0.957117   Yes
1 Thread      1000000      8     250  0.149263   13399   0.995517   Yes
SSE          10000000      8      25  0.156914   12746   0.999549   Yes

New            100000      8    2500  0.043920   45537   0.957117   Yes
4 Threads     1000000      8     250  0.039289   50905   0.995517   Yes
SSE          10000000      8      25  0.053432   37431   0.999549   Yes


New            100000      8    2500  0.075476   26499   0.957117   Yes
1 Thread      1000000      8     250  0.073838   27086   0.995517   Yes
AVX          10000000      8      25  0.096666   20690   0.999549   Yes

New            100000      8    2500  0.022043   90734   0.957117   Yes
4 Threads     1000000      8     250  0.019575  102169   0.995517   Yes
AVX          10000000      8      25  0.052228   38294   0.999549   Yes

0 个答案:

没有答案