When building OpenMP program, you must be sure to use -fopenmp
option in both compile
and link
stage (refer stackoverflow), else you may get a hit.
Take the following example:
#include <unistd.h>
#include <omp.h>
int main(void){
#pragma omp parallel num_threads(4)
for(;;)
{
sleep(1);
}
return 0;
}
Use gcc
to build it (contains both compile and link):
gcc -fopenmp parallel.c
Execute the program and check the threads number:
$ ./a.out &
[1] 5684
$ ps -T 5684
PID SPID TTY STAT TIME COMMAND
5684 5684 pts/16 Sl 0:00 ./a.out
5684 5685 pts/16 Sl 0:00 ./a.out
5684 5686 pts/16 Sl 0:00 ./a.out
5684 5687 pts/16 Sl 0:00 ./a.out
There are 4
threads which as our expected.
Then we create a neat Makefile and split the compile and link stages separately:
all:
gcc -fopenmp -c parallel.c -o parallel.o
gcc parallel.o
clean:
rm *.o a.out
Run the Makefie:
$ make
gcc -fopenmp -c parallel.c -o parallel.o
gcc parallel.o
parallel.o: In function `main':
parallel.c:(.text+0x19): undefined reference to `GOMP_parallel'
collect2: error: ld returned 1 exit status
make: *** [Makefile:3: all] Error 1
During the link phase, the gcc
complained it can’t find GOMP_parallel
. So we need to add -fopenmp
in link command too:
all:
gcc -fopenmp -c parallel.c -o parallel.o
gcc -fopenmp parallel.o
clean:
rm *.o a.out
This time all is OK:
$ make
gcc -fopenmp -c parallel.c -o parallel.o
gcc -fopenmp parallel.o
$ ./a.out &
[2] 6502
$ ps -T 6502
PID SPID TTY STAT TIME COMMAND
6502 6502 pts/16 Sl 0:00 ./a.out
6502 6503 pts/16 Sl 0:00 ./a.out
6502 6504 pts/16 Sl 0:00 ./a.out
6502 6505 pts/16 Sl 0:00 ./a.out
You can also use ldd
tool to check a.out
‘s dynamic libraries:
$ ldd /usr/lib/libgomp.so.1
linux-vdso.so.1 (0x00007ffd9c0dd000)
libgomp.so.1 => /usr/lib/libgomp.so.1 (0x00007fe5554ee000)
libpthread.so.0 => /usr/lib/libpthread.so.0 (0x00007fe5552d0000)
libc.so.6 => /usr/lib/libc.so.6 (0x00007fe554f2c000)
libdl.so.2 => /usr/lib/libdl.so.2 (0x00007fe554d28000)
/lib64/ld-linux-x86-64.so.2 (0x00007fe55571c000)
The libgomp
includes the GOMP_parallel
definition.