ldbc/ldbc_graphalytics

Is the Intel compiler a prerequisite to build GraphMat?

whatsthecraic opened this issue · 2 comments

Dear folks,

I've downloaded the package from https://graphalytics.org/software, the benchmark plus GraphMat. However, GraphMat fails to build, with errors such as:

mpic++ -cxx=g++ -fopenmp --std=c++11 -I/usr/include/mpi/ -I./include -I./include/GMDP -O3 -flto -fwhole-program -march=native -o bin/LDA src/LDA.cpp -lboost_serialization
In file included from ./include/GMDP/gmdp.h:82,
                 from ./include/GraphMatRuntime.h:32,
                 from src/LDA.cpp:33:
./include/GMDP/utils/edgelist.h: In constructor ‘GraphMat::edgelist_t<T>::edgelist_t(int, int, int)’:
./include/GMDP/utils/edgelist.h:65:44: error: there are no arguments to ‘_mm_malloc’ that depend on a template parameter, so a declaration of ‘_mm_malloc’ must be available [-fpermissive]
   65 |       edges = reinterpret_cast<edge_t<T>*>(_mm_malloc((size_t)nnz * sizeof(edge_t<T>), 64));
      |                                            ^~~~~~~~~~
./include/GMDP/utils/edgelist.h:65:44: note: (if you use ‘-fpermissive’, G++ will accept your code, but allowing the use of an undeclared name is deprecated)
In file included from ./include/GMDP/gmdp.h:82,
                 from ./include/GraphMatRuntime.h:32,
                 from src/LDA.cpp:33:
./include/GMDP/utils/edgelist.h: In function ‘void GraphMat::load_edgelist(const char*, GraphMat::edgelist_t<T>*, bool, bool, bool)’:
./include/GMDP/utils/edgelist.h:288:7: error: there are no arguments to ‘_mm_malloc’ that depend on a template parameter, so a declaration of ‘_mm_malloc’ must be available [-fpermissive]
  288 |       _mm_malloc((uint64_t)edgelist->nnz * (uint64_t)sizeof(edge_t<T>), 64));
      |       ^~~~~~~~~~
[...]
In file included from ./include/GMDP/multinode/intersectreduce.h:37,
                 from ./include/GMDP/gmdp.h:93,
                 from ./include/GraphMatRuntime.h:32,
                 from src/LDA.cpp:33:
./include/GMDP/singlenode/intersectreduce.h: In instantiation of ‘void GraphMat::intersect_dense_segment(Ta*, int*, int*, int, Tb*, int*, Tc*, int*, void (*)(const Ta&, const Tb&, Tc*, void*), void*) [with Ta = bool; Tb = LatentVector<20>; Tc = LatentVector<20>]’:
./include/GMDP/singlenode/intersectreduce.h:76:28:   required from ‘void GraphMat::intersect_segment(const GraphMat::DenseSegment<Ta>*, const GraphMat::DenseSegment<Tb>*, GraphMat::DenseSegment<Tc>*, void (*)(const Ta&, const Tb&, Tc*, void*), void*) [with Ta = bool; Tb = LatentVector<20>; Tc = LatentVector<20>]’
./include/GMDP/multinode/intersectreduce.h:49:24:   required from ‘void GraphMat::IntersectReduce(const GraphMat::SpVec<SpSegment<Ta> >*, const GraphMat::SpVec<SpSegment<Tb> >*, GraphMat::SpVec<SpSegment<Tc> >*, void (*)(const Ta&, const Tb&, Tc*, void*), void*) [with SpSegment = GraphMat::DenseSegment; Ta = bool; Tb = LatentVector<20>; Tc = LatentVector<20>]’
./include/GraphMatRuntime.h:145:30:   required from ‘void GraphMat::run_graph_program(GraphMat::GraphProgram<T, U, V, E>*, GraphMat::Graph<V, E>&, int, GraphMat::run_graph_program_temp_structure<T, U, V>*) [with T = LatentVector<20>; U = LatentVector<20>; V = LatentVector<20>; E = int]’
src/LDA.cpp:290:53:   required from here
./include/GMDP/singlenode/intersectreduce.h:53:24: error: ‘_popcnt32’ was not declared in this scope
   53 |     int cnt = _popcnt32(bv3[ii]);
      |               ~~~~~~~~~^~~~~~~~~

I assume these are intrinsics provided by icc?
mpich v3.3.1, gcc v.9.1.0

Thanks,
Dean

Hello, @whatsthecraic. In principle, GCC should work with GraphMat, but we do not use it in practice for performance reasons, therefore it is not well tested. I would advice trying with ICC.

yeah at the end I've managed to compile it with OpenMPI + ICC. On my computer, for some reason mpich did not terminate when building the program.