DPCT1104#

Message#

<expression text> should point to a dynamic library loaded in memory. The dynamic library should supply wrapped kernel functions.

Detailed Help#

The CUDA* application expects <expression text> to point to a CUDA module whose file image has been copied to memory. The user should ensure that the CUDA code that generated the CUDA module is migrated to SYCL* code, compiled to generate a kernel library, and then copied to memory by the migrated SYCL application.

Suggestions to Fix#

The user should find the module source files that are used to make the CUDA module and migrate the module source files to SYCL using the --extra-arg=--ptx option of SYCLomatic to generate wrapped kernel functions:

dpct <module source file(s)> --extra-arg=--ptx

The migrated module source file(s) should be compiled to build a kernel library.

On Linux*:

icpx -fsycl <migrated module source file(s)> -fPIC -shared -o <kernel library filename>

On Windows*:

icpx -fsycl <migrated module source file(s)> -shared -o <kernel library filename>

The user should ensure that the application will load the kernel library image into memory at runtime. For the following example this can be ensured by setting <kernel library filename> to library.so.

For example, this original CUDA code:

1void test() {
2  CUmodule module;
3  const void *image = loadFile("module.ptx");
4  cuModuleLoadData(&module, image);
5}

results in the following migrated SYCL code:

1void test() {
2  dpct::kernel_library module;
3  const void *image = loadFile("module.ptx");
4  /*
5  DPCT1104:0: 'image' should point to a dynamic library loaded in memory. The
6  dynamic library should supply wrapped kernel functions.
7  */
8  module = dpct::load_kernel_library_mem(image);
9}

which is rewritten to:

1void test() {
2  dpct::kernel_library module;
3  // "library.so" is compiled from the SYCL code which is migrated from CUDA code
4  // used to build "module.ptx"
5  const void *image = loadFile("library.so");
6  module = dpct::load_kernel_library_mem(image);
7}