integrate cuda with application

I have an application and I want to change one of its function to cuda implementation. How to do it to not influence the original application. Can I compile this function into a DLL?

You can compile a CPU function that launches a kernel into an object file and link it with the rest of the application.


Is like the following?

In application:




In another file: f1





Then nvcc f1 and link them?


Yeah… and also, if your app. is written in C/C++ then, you can compile whole of your app. with ‘nvcc’ itself (basically nvcc will call your C/C++ compiler for those C/C++ codes).

Else, what you are thinking is perfectly right.

I use a makefile to compile my application. If I want to use the method teju suggested, how to write the new makefile?

Here’s a simple makefile (formatting is messed up since tabs/spaces don’t survive the post).

As you can see, I use nvcc to compile a file with the kernel and its launcher function into an object file. I then use mpicc (since this is an MPI app that uses CUDA) to compile the C++ file and link in the object file (mpicc is also a compiler driver, using host’s C++ compiler for actual compilation).

Look at the nvcc documentation on information how to pass parameters to the host C/C++ compiler.


multi: kernel.o test.cpp
mpicc -I/usr/local/cuda/include -L /usr/local/cuda/lib -lcudart test.cpp kernel.o -o multi
nvcc -c --ptxas-options=-v -maxrregcount=32
rm -f *.o
scrub: clean
rm -f multi

Thank you very much.

I try it, but doesn’t wok.

I have two files:

file1: kernel and its launcher function

file2: main function to call the launcher function

To file1 I use the command you mentioned:

nvcc -c --ptxas-options=-v -maxrregcount=32

the error is:

“/usr/include/c++/4.2.1/x86_64-suse-linux/bits/gthr-default.h”, line 92: error:

      function "__gthrw_pthread_once" was referenced but not defined

static __typeof(pthread_once) __gthrw_pthread_once attribute ((weakref(“pthread_once”)));

The reason for those errors are due to not mentioning the location where your CUDA header files are located. (Basically the ‘-I’ option which comes with ‘nvcc’)
Here’s the correct sequence of commands for the example you have provided.

Compile file1:
nvcc --compiler-bindir “” -I “” -c -o file1.obj file1

Compile file2:
nvcc --compiler-bindir “” -I “” -c -o file1.obj file1

Link them: (produces an executable named ‘a.exe’)
nvcc --compiler-bindir “” -I “” -o a.exe file1.obj file2.obj

gcc is in my search path so I try

nvcc -I “/usr/local/cuda2.0/include/” -c -o test.o

The error still exists.

I attach this two files. It’s the sdk example matMulGPU. I separate it inot main.c and

Could you try it?



It works. I login one computer but use the nvcc coming from another computer.

Now I can link them together.