As referred in The first gcc bug I ever meet, I upgraded gcc
to the newest 7.1.0
version to conquer building OpenMP
errors. But unfortunately, when using taskloop
clause, weird issue happened again. My application utilizes HElib, and I just added following statement in a source file:
#pragma omp taskloop
Then the strange link error reported:
In function `EncryptedArray::EncryptedArray(EncryptedArray const&)':
/root/Project/../../HElib/src/EncryptedArray.h:539: undefined reference to `cloned_ptr<EncryptedArrayBase, deep_clone<EncryptedArrayBase> >::cloned_ptr(cloned_ptr<EncryptedArrayBase, deep_clone<EncryptedArrayBase> > const&)'
collect2: error: ld returned 1 exit status
I tried to debug it, nevertheless, nothing valuable was found.
So I attempted to use clang
. Install it on ArchLinux
like this:
# pacman -S clang
resolving dependencies...
looking for conflicting packages...
Packages (2) llvm-libs-4.0.0-3 clang-4.0.0-3
Total Download Size:53.24 MiB
Total Installed Size: 275.24 MiB
:: Proceed with installation? [Y/n] y
......
checking available disk space [#########################################] 100%
:: Processing package changes...
(1/2) installing llvm-libs [#########################################] 100%
(2/2) installing clang [#########################################] 100%
Optional dependencies for clang
openmp: OpenMP support in clang with -fopenmp
python2: for scan-view and git-clang-format [installed]
:: Running post-transaction hooks...
(1/1) Arming ConditionNeedsUpdate...
Unlike gcc
, to enable OpenMP
feature in clang
, we need to install an additional openmp
package:
# pacman -S openmp
Write a simple program:
# cat parallel.cpp
#include <stdio.h>
#include <omp.h>
int main(void) {
omp_set_num_threads(5);
#pragma omp parallel for
for (int i = 0; i < 5; i++) {
#pragma omp taskloop
for (int j = 0; j < 3; j++) {
printf("%d\n", omp_get_thread_num());
}
}
}
Compile and run it:
# clang++ -fopenmp parallel.cpp
# ./a.out
0
0
0
0
0
1
1
2
4
4
4
4
3
0
1
Clang OpenMP
works as I expected. Build my project again, no eccentric errors! Work like a charm!
So according to my testing experience, clang
may be a better choice than gcc
in developing OpenMP
program, especially for some new OpenMP
features.