ipupoplar

How can Poplar codelets include code from other header files?


Is it possible for codelets to reference code in other files, like header files?

If I have a codelet file

    //FileA.cpp
    #include "FileB.h"
    class SomeCustomVertex : public Vertex { 
    public:
       bool compute() {
          int a = SomeConstantDefinedInFileB; 
       }
    ... 
    }

and some other "codelet" file

    //FileB.h
    const int SomeConstantDefineInFileB = 42;

and in the host graph program:

graph.addCodelets({"codelets/FileA.cpp", "codelets/FileB.h"});

I get a compile error from popc:

fatal error: 'FileB.h' file not found
#include "FileB.h"
         ^~~~~~~~~~~~~~~~~~~~~~~~~~
1 error generated.
terminate called after throwing an instance of 'poplar::graph_program_compilation_error'
  what():  Codelet compilation failed (see compiler output for details)

Solution

  • I figured this out.

    Graph::addCodelets has a parameter StringRef compileFlags = "", which you can use to inject compiler options.

    popc --help shows an option

    -I arg                        Add directory to include search path
    

    So when I use graph.addCodelets({"codelets/FileA.cpp"}, "-I codelets"); in the host program, and have my codelets in 'codelets' subdirectory, this works. No need to explicitly list the ".h" files in the arguments.

    Incidentally, also a good way to ensure compiler optimisation (-O3) for the custom codelets.