1. 程式人生 > >C++ openmp並行程序在多核linux上如何最大化使用cpu

C++ openmp並行程序在多核linux上如何最大化使用cpu

.com 核心 程序 cpu pragma -m ron amp 指令

以上代碼中,#pragma omp parallel for

這一行的作用即是調用openmp的功能,根據檢測到的CPU核心數目,將for (i = 0; i < 1000000000; i++)這個循環執行過程平均分配給每一個CPU核心。

去掉#pragma omp parallel for這行,則和普通的串行代碼效果一致。

註意,要使用openmp功能,在編譯的時候需要加上-fopenmp編譯參數。

以下是兩種編譯搭配兩種代碼出現的4種結果,可以很直觀地看到效果:

1、代碼裏含有#pragma omp parallel for,編譯參數有-fopenmp

Endys-MacBook-Pro:Desktop endy$ vi test.c

Endys-MacBook-Pro:Desktop endy$ gcc-6 test.c -o test -fopenmp

Endys-MacBook-Pro:Desktop endy$ ./test

Program costs 50202611.00 clock tick.

2、代碼裏含有#pragma omp parallel for,編譯參數沒有-fopenmp

Endys-MacBook-Pro:Desktop endy$ gcc-6 test.c -o test

Endys-MacBook-Pro:Desktop endy$ ./test

Program costs 4068178.00

clock tick.

3、代碼裏沒有#pragma omp parallel for,編譯參數有-fopenmp

Endys-MacBook-Pro:Desktop endy$ vi test.c

Endys-MacBook-Pro:Desktop endy$ gcc-6 test.c -o test -fopenmp

Endys-MacBook-Pro:Desktop endy$ ./test

Program costs 4090744.00 clock tick.

4、代碼裏沒有#pragma omp parallel for,編譯參數沒有-fopenmp

Endys-MacBook-Pro:Desktop endy$ vi test.c

Endys-MacBook-Pro:Desktop endy$ gcc-6 test.c -o test

Endys-MacBook-Pro:Desktop endy$ ./test

Program costs 4170093.00 clock tick.

可以看出,只有在情況1下,openmp生效,其他3種情況下,均為單核運行,2、3、4結果較為接近,而1的運行結果大約相差25%。

值得註意的是,使用多核心的case 1竟然比單核的其他3種case慢了25%,原因是在這種單一的循環運算中,並行分配CPU任務的指令比直接執行下一個循環指令的效率更低。所以並不是用並行運算就一定能夠提高運算效率的,要根據實際情況來判斷。

C++ openmp並行程序在多核linux上如何最大化使用cpu