Error of missing GOMP on centos 6 x86_64 with anaconda python 3

Hello, everyone

I am testing the installation of pyfr1.5.0 on a single-core VPS on bandwagonhost with centos 6. Because the softwares’ versions of the OS are very old, the python 3 is installed using anaconda, and the gcc 4.9.2 is installed using devtoolset-3 of RHSCL. All dependency and version number is satisified. But the test case gives me an error:

$ [root@localhost euler_vortex_2d]# pyfr run -b openmp euler_vortex_2d.pyfrm euler_vortex_2d.ini

error msg:

Traceback (most recent call last):
File "/op/anaconda3/lib/python3.5/site-packages/pyfr-1.5.0-py3.5.egg/pyfr/util.py", line 32, in __call__
KeyError: (<function OpenMPKernelProvider._build_kernel at 0x7f165ac5fb70>, b'\x80\x03X\x05\x00\x00\x00tfluxq\x00X^\x1e\x00\x00\n\n#include <omp.h>\n#include <stdlib.h>\n#include <tgmath.h>\n\n#define PYFR_ALIGN_BYTES 64\n#define SOA_SZ 8\n\n#define min(a, b) ((a) < (b) ? (a) : (b))\n#define max(a, b) ((a) > (b) ? (a) : (b))\n\n// Typedefs\ntypedef double fpdtype_t;\n\n// OpenMP static loop scheduling functions\n\nstatic inline int\ngcd(int a, int b)\n{\n return (a == 0) ? b : gcd(b % a, a);\n}\n\nstatic inline void\nloop_sched_1d(int n, int align, int *b, int *e)\n{\n int tid = omp_get_thread_num();\n int nth = omp_get_num_threads();\n\n // Round up n to be a multiple of nth\n int rn = n + nth - 1 - (n - 1) % nth;\n\n // Nominal tile size\n int sz = rn / nth;\n\n // Handle alignment\n sz += align - 1 - (sz - 1) % align;\n\n // Assign the starting and ending index\n *b = sz * tid;\n *e = min(*b + sz, n);\n\n // Clamp\n if (*b >= n)\n *b = *e = 0;\n}\n\nstatic inline void\nloop_sched_2d(int nrow, int ncol, int colalign,\n int *rowb, int *rowe, int *colb, int *cole)\n{\n int tid = omp_get_thread_num();\n int nth = omp_get_num_threads();\n\n // Distribute threads\n int nrowth = gcd(nrow, nth);\n int ncolth = nth / nrowth;\n\n // Row and column indices for our thread\n int rowix = tid / ncolth;\n int colix = tid % ncolth;\n\n // Round up ncol to be a multiple of ncolth\n int rncol = ncol + ncolth - 1 - (ncol - 1) % ncolth;\n\n // Nominal tile size\n int ntilerow = nrow / nrowth;\n int ntilecol = rncol / ncolth;\n\n // Handle column alignment\n ntilecol += colalign - 1 - (ntilecol - 1) % colalign;\n\n // Assign the starting and ending row to each thread\n *rowb = ntilerow * rowix;\n *rowe = *rowb + ntilerow;\n\n // Assign the starting and ending column to each thread\n *colb = ntilecol * colix;\n *cole = min(*colb + ntilecol, ncol);\n\n // Clamp\n if (*colb >= ncol)\n *colb = *cole = 0;\n}\n\n\n\n\n\n\n\n\n\nvoid tflux(int _ny, int _nx, fpdtype_t* __restrict__ f_v, int ldf, const fpdtype_t* __restrict__ smats_v, int ldsmats, const fpdtype_t* __restrict__ u_v, int ldu)\n {\n #define X_IDX (_xi + _xj)\n #define X_IDX_AOSOA(v, nv) ((_xi/SOA_SZ*(nv) + (v))*SOA_SZ + _xj)\n int align = PYFR_ALIGN_BYTES / sizeof(fpdtype_t);\n #pragma omp parallel\n {\n \n int rb, re, cb, ce;\n loop_sched_2d(_ny, _nx, align, &rb, &re, &cb, &ce);\n int nci = ((ce - cb) / SOA_SZ)*SOA_SZ;\n for (int _y = rb; _y < re; _y++)\n {\n for (int _xi = cb; _xi < cb + nci; _xi += SOA_SZ)\n {\n #pragma omp simd\n for (int _xj = 0; _xj < SOA_SZ; _xj++)\n {\n \n // Compute the flux\n fpdtype_t ftemp[2][4];\n fpdtype_t p, v[2];\n {\n\n fpdtype_t invrho_ = 1.0/u_v[ldu*_y + X_IDX_AOSOA(0, 4)], E_ = u_v[ldu*_y + X_IDX_AOSOA(3, 4)];\n\n // Compute the velocities\n fpdtype_t rhov_[2];\n rhov_[0] = u_v[ldu*_y + X_IDX_AOSOA(1, 4)];\n v[0] = invrho_*rhov_[0];\n rhov_[1] = u_v[ldu*_y + X_IDX_AOSOA(2, 4)];\n v[1] = invrho_*rhov_[1];\n\n // Compute the pressure\n p = 0.3999999999999999*(E_ - 0.5*invrho_*((rhov_[0])*(rhov_[0]) + (rhov_[1])*(rhov_[1])));\n\n // Density and energy fluxes\n ftemp[0][0] = rhov_[0];\n ftemp[0][3] = (E_ + p)*v[0];\n ftemp[1][0] = rhov_[1];\n ftemp[1][3] = (E_ + p)*v[1];\n\n // Momentum fluxes\n ftemp[0][1] = rhov_[0]*v[0] + p;\n ftemp[0][2] = rhov_[0]*v[1];\n ftemp[1][1] = rhov_[1]*v[0];\n ftemp[1][2] = rhov_[1]*v[1] + p;\n\n};\n\n // Transform the fluxes\n f_v[(0*_ny + _y)*ldf + X_IDX_AOSOA(0, 4)] = smats_v[(0*_ny + _y)*ldsmats + X_IDX_AOSOA(0, 2)]*ftemp[0][0] + smats_v[(0*_ny + _y)*ldsmats + X_IDX_AOSOA(1, 2)]*ftemp[1][0];\n f_v[(0*_ny + _y)*ldf + X_IDX_AOSOA(1, 4)] = smats_v[(0*_ny + _y)*ldsmats + X_IDX_AOSOA(0, 2)]*ftemp[0][1] + smats_v[(0*_ny + _y)*ldsmats + X_IDX_AOSOA(1, 2)]*ftemp[1][1];\n f_v[(0*_ny + _y)*ldf + X_IDX_AOSOA(2, 4)] = smats_v[(0*_ny + _y)*ldsmats + X_IDX_AOSOA(0, 2)]*ftemp[0][2] + smats_v[(0*_ny + _y)*ldsmats + X_IDX_AOSOA(1, 2)]*ftemp[1][2];\n f_v[(0*_ny + _y)*ldf + X_IDX_AOSOA(3, 4)] = smats_v[(0*_ny + _y)*ldsmats + X_IDX_AOSOA(0, 2)]*ftemp[0][3] + smats_v[(0*_ny + _y)*ldsmats + X_IDX_AOSOA(1, 2)]*ftemp[1][3];\n f_v[(1*_ny + _y)*ldf + X_IDX_AOSOA(0, 4)] = smats_v[(1*_ny + _y)*ldsmats + X_IDX_AOSOA(0, 2)]*ftemp[0][0] + smats_v[(1*_ny + _y)*ldsmats + X_IDX_AOSOA(1, 2)]*ftemp[1][0];\n f_v[(1*_ny + _y)*ldf + X_IDX_AOSOA(1, 4)] = smats_v[(1*_ny + _y)*ldsmats + X_IDX_AOSOA(0, 2)]*ftemp[0][1] + smats_v[(1*_ny + _y)*ldsmats + X_IDX_AOSOA(1, 2)]*ftemp[1][1];\n f_v[(1*_ny + _y)*ldf + X_IDX_AOSOA(2, 4)] = smats_v[(1*_ny + _y)*ldsmats + X_IDX_AOSOA(0, 2)]*ftemp[0][2] + smats_v[(1*_ny + _y)*ldsmats + X_IDX_AOSOA(1, 2)]*ftemp[1][2];\n f_v[(1*_ny + _y)*ldf + X_IDX_AOSOA(3, 4)] = smats_v[(1*_ny + _y)*ldsmats + X_IDX_AOSOA(0, 2)]*ftemp[0][3] + smats_v[(1*_ny + _y)*ldsmats + X_IDX_AOSOA(1, 2)]*ftemp[1][3];\n\n }\n }\n for (int _xi = cb + nci, _xj = 0; _xj < ce - _xi;\n _xj++)\n {\n \n // Compute the flux\n fpdtype_t ftemp[2][4];\n fpdtype_t p, v[2];\n {\n\n fpdtype_t invrho_ = 1.0/u_v[ldu*_y + X_IDX_AOSOA(0, 4)], E_ = u_v[ldu*_y + X_IDX_AOSOA(3, 4)];\n\n // Compute the velocities\n fpdtype_t rhov_[2];\n rhov_[0] = u_v[ldu*_y + X_IDX_AOSOA(1, 4)];\n v[0] = invrho_*rhov_[0];\n rhov_[1] = u_v[ldu*_y + X_IDX_AOSOA(2, 4)];\n v[1] = invrho_*rhov_[1];\n\n // Compute the pressure\n p = 0.3999999999999999*(E_ - 0.5*invrho_*((rhov_[0])*(rhov_[0]) + (rhov_[1])*(rhov_[1])));\n\n // Density and energy fluxes\n ftemp[0][0] = rhov_[0];\n ftemp[0][3] = (E_ + p)*v[0];\n ftemp[1][0] = rhov_[1];\n ftemp[1][3] = (E_ + p)*v[1];\n\n // Momentum fluxes\n ftemp[0][1] = rhov_[0]*v[0] + p;\n ftemp[0][2] = rhov_[0]*v[1];\n ftemp[1][1] = rhov_[1]*v[0];\n ftemp[1][2] = rhov_[1]*v[1] + p;\n\n};\n\n // Transform the fluxes\n f_v[(0*_ny + _y)*ldf + X_IDX_AOSOA(0, 4)] = smats_v[(0*_ny + _y)*ldsmats + X_IDX_AOSOA(0, 2)]*ftemp[0][0] + smats_v[(0*_ny + _y)*ldsmats + X_IDX_AOSOA(1, 2)]*ftemp[1][0];\n f_v[(0*_ny + _y)*ldf + X_IDX_AOSOA(1, 4)] = smats_v[(0*_ny + _y)*ldsmats + X_IDX_AOSOA(0, 2)]*ftemp[0][1] + smats_v[(0*_ny + _y)*ldsmats + X_IDX_AOSOA(1, 2)]*ftemp[1][1];\n f_v[(0*_ny + _y)*ldf + X_IDX_AOSOA(2, 4)] = smats_v[(0*_ny + _y)*ldsmats + X_IDX_AOSOA(0, 2)]*ftemp[0][2] + smats_v[(0*_ny + _y)*ldsmats + X_IDX_AOSOA(1, 2)]*ftemp[1][2];\n f_v[(0*_ny + _y)*ldf + X_IDX_AOSOA(3, 4)] = smats_v[(0*_ny + _y)*ldsmats + X_IDX_AOSOA(0, 2)]*ftemp[0][3] + smats_v[(0*_ny + _y)*ldsmats + X_IDX_AOSOA(1, 2)]*ftemp[1][3];\n f_v[(1*_ny + _y)*ldf + X_IDX_AOSOA(0, 4)] = smats_v[(1*_ny + _y)*ldsmats + X_IDX_AOSOA(0, 2)]*ftemp[0][0] + smats_v[(1*_ny + _y)*ldsmats + X_IDX_AOSOA(1, 2)]*ftemp[1][0];\n f_v[(1*_ny + _y)*ldf + X_IDX_AOSOA(1, 4)] = smats_v[(1*_ny + _y)*ldsmats + X_IDX_AOSOA(0, 2)]*ftemp[0][1] + smats_v[(1*_ny + _y)*ldsmats + X_IDX_AOSOA(1, 2)]*ftemp[1][1];\n f_v[(1*_ny + _y)*ldf + X_IDX_AOSOA(2, 4)] = smats_v[(1*_ny + _y)*ldsmats + X_IDX_AOSOA(0, 2)]*ftemp[0][2] + smats_v[(1*_ny + _y)*ldsmats + X_IDX_AOSOA(1, 2)]*ftemp[1][2];\n f_v[(1*_ny + _y)*ldf + X_IDX_AOSOA(3, 4)] = smats_v[(1*_ny + _y)*ldsmats + X_IDX_AOSOA(0, 2)]*ftemp[0][3] + smats_v[(1*_ny + _y)*ldsmats + X_IDX_AOSOA(1, 2)]*ftemp[1][3];\n\n }\n }\n }\n #undef X_IDX\n #undef X_IDX_AOSOA\n }\n\nq\x01]q\x02(cnumpy\nint32\nq\x03h\x03cnumpy\nint64\nq\x04h\x03h\x04h\x03h\x04h\x03e\x87q\x05.', b'\x80\x03}q\x00.')

During handling of the above exception, another exception occurred:

Traceback (most recent call last):
File "/op/anaconda3/bin/pyfr", line 11, in <module>
load_entry_point('pyfr==1.5.0', 'console_scripts', 'pyfr')()
File "/op/anaconda3/lib/python3.5/site-packages/pyfr-1.5.0-py3.5.egg/pyfr/__main__.py", line 110, in main
File "/op/anaconda3/lib/python3.5/site-packages/pyfr-1.5.0-py3.5.egg/pyfr/__main__.py", line 235, in process_run
File "/op/anaconda3/lib/python3.5/site-packages/pyfr-1.5.0-py3.5.egg/pyfr/__main__.py", line 216, in _process_common
File "/op/anaconda3/lib/python3.5/site-packages/pyfr-1.5.0-py3.5.egg/pyfr/solvers/__init__.py", line 14, in get_solver
File "/op/anaconda3/lib/python3.5/site-packages/pyfr-1.5.0-py3.5.egg/pyfr/integrators/__init__.py", line 43, in get_integrator
File "/op/anaconda3/lib/python3.5/site-packages/pyfr-1.5.0-py3.5.egg/pyfr/integrators/std/controllers.py", line 12, in __init__
File "/op/anaconda3/lib/python3.5/site-packages/pyfr-1.5.0-py3.5.egg/pyfr/integrators/std/steppers.py", line 8, in __init__
File "/op/anaconda3/lib/python3.5/site-packages/pyfr-1.5.0-py3.5.egg/pyfr/integrators/std/base.py", line 12, in __init__
File "/op/anaconda3/lib/python3.5/site-packages/pyfr-1.5.0-py3.5.egg/pyfr/integrators/base.py", line 59, in __init__
File "/op/anaconda3/lib/python3.5/site-packages/pyfr-1.5.0-py3.5.egg/pyfr/solvers/base/system.py", line 65, in __init__
File "/op/anaconda3/lib/python3.5/site-packages/pyfr-1.5.0-py3.5.egg/pyfr/solvers/base/system.py", line 174, in _gen_kernels
File "/op/anaconda3/lib/python3.5/site-packages/pyfr-1.5.0-py3.5.egg/pyfr/solvers/euler/elements.py", line 74, in <lambda>
File "/op/anaconda3/lib/python3.5/site-packages/pyfr-1.5.0-py3.5.egg/pyfr/backends/base/backend.py", line 166, in kernel
File "/op/anaconda3/lib/python3.5/site-packages/pyfr-1.5.0-py3.5.egg/pyfr/backends/base/kernels.py", line 161, in kernel_meth
File "/op/anaconda3/lib/python3.5/site-packages/pyfr-1.5.0-py3.5.egg/pyfr/util.py", line 34, in __call__
File "/op/anaconda3/lib/python3.5/site-packages/pyfr-1.5.0-py3.5.egg/pyfr/backends/openmp/provider.py", line 13, in _build_kernel
File "/op/anaconda3/lib/python3.5/site-packages/pyfr-1.5.0-py3.5.egg/pyfr/backends/openmp/compiler.py", line 61, in __init__
File "/op/anaconda3/lib/python3.5/site-packages/pyfr-1.5.0-py3.5.egg/pyfr/backends/openmp/compiler.py", line 33, in __init__
File "/op/anaconda3/lib/python3.5/ctypes/__init__.py", line 347, in __init__
self._handle = _dlopen(self._name, mode)
OSError: /op/anaconda3/bin/../lib/libgomp.so.1: version `GOMP_4.0' not found (required by /tmp/pyfr-0-i5qtiki9/libtmp.so)

It seems a conflict of GOMP libs. how to resolve this problem? I tried to use follow method to diagnose it

$ [root@localhost couette_flow_2d]# ldd /tmp/pyfr-0-c6hurolh/libtmp.so
ldd: /tmp/pyfr-0-c6hurolh/libtmp.so: No such file or directory

But the temporary file is missing.

Is there anyway to solve this problem? Is cflags in [backend-openmp] helpful to this kind of problem?

Here is something about the libgomp.so
`

[root@localhost lib]# ldd --verbose libgomp.so
linux-vdso.so.1 => (0x00007ffcb13a0000)
librt.so.1 => /lib64/librt.so.1 (0x00007f6b261cb000)
libpthread.so.0 => /lib64/libpthread.so.0 (0x00007f6b25fad000)
libc.so.6 => /lib64/libc.so.6 (0x00007f6b25c19000)
/lib64/ld-linux-x86-64.so.2 (0x00007f6b265e7000)

Version information:
./libgomp.so:
librt.so.1 (GLIBC_2.2.5) => /lib64/librt.so.1
libpthread.so.0 (GLIBC_2.3.4) => /lib64/libpthread.so.0
libpthread.so.0 (GLIBC_2.2.5) => /lib64/libpthread.so.0
libc.so.6 (GLIBC_2.3) => /lib64/libc.so.6
libc.so.6 (GLIBC_2.2.5) => /lib64/libc.so.6
/lib64/librt.so.1:
libpthread.so.0 (GLIBC_2.2.5) => /lib64/libpthread.so.0
libpthread.so.0 (GLIBC_PRIVATE) => /lib64/libpthread.so.0
libc.so.6 (GLIBC_2.3.2) => /lib64/libc.so.6
libc.so.6 (GLIBC_2.2.5) => /lib64/libc.so.6
libc.so.6 (GLIBC_PRIVATE) => /lib64/libc.so.6
/lib64/libpthread.so.0:
ld-linux-x86-64.so.2 (GLIBC_2.3) => /lib64/ld-linux-x86-64.so.2
ld-linux-x86-64.so.2 (GLIBC_2.2.5) => /lib64/ld-linux-x86-64.so.2
ld-linux-x86-64.so.2 (GLIBC_PRIVATE) => /lib64/ld-linux-x86-64.so.2
libc.so.6 (GLIBC_2.3.2) => /lib64/libc.so.6
libc.so.6 (GLIBC_PRIVATE) => /lib64/libc.so.6
libc.so.6 (GLIBC_2.2.5) => /lib64/libc.so.6
/lib64/libc.so.6:
ld-linux-x86-64.so.2 (GLIBC_PRIVATE) => /lib64/ld-linux-x86-64.so.2
ld-linux-x86-64.so.2 (GLIBC_2.3) => /lib64/ld-linux-x86-64.so.2
`

Additional information about glibc in the OS:

[root@localhost lib]# ldd --version ldd (GNU libc) 2.12 Copyright (C) 2010 Free Software Foundation, Inc. This is free software; see the source for copying conditions. There is NO warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. Written by Roland McGrath and Ulrich Drepper.

I just solved this problem by adding the following line in the configuration file:

`
[backend-openmp]

cblas=/opt/OpenBLAS/lib/libopenblas.so
cflags**=-Wl,-rpath /usr/**lib64

`

after I found there are so many libgomps in my system:

`
[root@localhost euler_vortex_2d]# find / -name libgomp.so.1
/usr/lib64/libgomp.so.1
/op/anaconda3/pkgs/libgcc-4.8.5-2/lib/libgomp.so.1
/op/anaconda3/lib/libgomp.so.1

`

For future reference if you export the environmental variable:

$ export PYFR_DEBUG_OMP_KEEP_LIBS=true

then PyFR will keep the temporary directories around in order to permit
further debugging.

Regards, Freddie.