我有一系列基准测试,通过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