I want to design my program with both Qt and CUDA under ubuntu 8.10. Qt for the GUI and CUDA for the calculation.
Does anyone know how I can ahieve this?
Thanks.
At work, we have done this by making a C++ shared library. This contains a nice object that allocatest device&host memory as needed and does the CUDA calls, etc. etc.
Then we link this into a Qt program. Easy!
Probably good that you kept them separate. moc + nvcc = probable badness.
Thanks. I’ll have a try.
Then, would you please tell me your suggestion?
If I want to program with cuda, what’s the best choice for GUI design? GTK or something?
No, I meant that it’s probably a good idea that he kept Qt and CUDA source separate, not that you shouldn’t use them together. We use Qt for the visual profiler. I personally have used Qt a lot and really like it. By all means, use Qt.
All I meant is that I’m a little concerned that if you try to use CUDART and compile with nvcc, what you get from Qt’s meta-object compiler might not get along with nvcc because it’s very bizarre C++. In that case, a library is probably the easiest way to use both. I’m just not sure what the toolchain for a file that has both CUDA and Qt source is, and it’s sufficiently far away enough from standard compilation that it might be slightly less than stable.
Oh, I got it.
Thanks a lot.
Hello kristleifur,
some time ago you replied to a request with on how to combine Qt and CUDA with
Well, it sounds easy and straightforward. I attach the Makefile below used to create a static library containing cuda code as well as other C++ code, but it does not work, actually the archiver complains.
Do I have to use GCC with some special flags, or “ar”?
How would I link my Qt application, i.e. what do I have to add to the .pro file? Do I need to link a second time with cudart?
Many thanks for your help in advance,
peter
PROCESSLIB := libprocess.a
all : $(PROCESSLIB)
CUDA_INSTALL_PATH ?= /usr/local/cuda
GCC		:= gcc
NVCC	   := $(CUDA_INSTALL_PATH)/bin/nvcc 
CXX		:= g++
CC		 := gcc
CUDALINKER := g++ -fPIC
LINKER	 := g++
SRCDIR	 ?= .
ROOTDIR	?= .
ROOTBINDIR ?= $(ROOTDIR)/bin
ROOTOBJDIR ?= $(ROOTDIR)/obj
CUDASDK_DIR := $(HOME)/NVIDIA_GPU_Computing_SDK/C
CUDASDK_LIBDIR := $(CUDASDK_DIR)/lib
CUDASDK_COMMONINCDIR := $(CUDASDK_DIR)/common/inc
CUDASDK_COMMONLIBDIR := $(CUDASDK_DIR)/common/lib/linux
VERBOSE :=
COMMONINCLUDES  += -I. -I../common
CUDAINCLUDES  += -I$(CUDA_INSTALL_PATH)/include -I$(CUDASDK_COMMONINCDIR)
COMMONFLAGS += -DUNIX
CXXFLAGS := \
	-W -Wall \
	-Wimplicit \
	-Wswitch \
	-Wformat \
	-Wchar-subscripts \
	-Wparentheses \
	-Wmultichar \
	-Wtrigraphs \
	-Wpointer-arith \
	-Wcast-align \
	-Wreturn-type \
	-Wno-unused-function \
	$(SPACE)
CFLAGS := $(CXXFLAGS) \
	-Wstrict-prototypes \
	-Wmissing-prototypes \
	-Wmissing-declarations \
	-Wnested-externs \
	-Wmain
	
NVCCFLAGS := \
	-c -Xopencc \
	-OPT:unroll_size=200000 
# Debug/release configuration
ifeq ($(dbg),1)
	COMMONFLAGS += -g
	NVCCFLAGS   += -D_DEBUG
	CXXFLAGS	+= -D_DEBUG
	CFLAGS	  += -D_DEBUG
	BINSUBDIR   := debug
	LIBSUFFIX   := D
else 
	COMMONFLAGS += -O2 
	BINSUBDIR   := release
	LIBSUFFIX   :=
	NVCCFLAGS   += --compiler-options -fno-strict-aliasing
	CXXFLAGS	+= -fno-strict-aliasing
	CFLAGS	  += -fno-strict-aliasing
endif
	
CUDALIB := -L$(CUDA_INSTALL_PATH)/lib64 -L$(CUDASDK_LIBDIR) -L$(CUDASDK_COMMONLIBDIR)
CUDALIB += -lcudart -lcutil ${OPENGLLIB} $(PARAMGLLIB) $(RENDERCHECKGLLIB) $(CUDPPLIB) ${LIB}
TARGETDIR := $(ROOTBINDIR)/$(BINSUBDIR)
# Add common flags
NVCCFLAGS += $(COMMONFLAGS) $(COMMONINCLUDES) $(CUDAINCLUDES)
CFLAGS	+= $(COMMONFLAGS) $(COMMONINCLUDES) 
CXXFLAGS  += $(COMMONFLAGS) $(COMMONINCLUDES) 
OBJDIR := $(ROOTOBJDIR)/$(BINSUBDIR)
CUDAOBJS := \
	$(OBJDIR)/processspec.cpp.o \
	$(OBJDIR)/migration.cu.o
$(PROCESSLIB): directories $(CUDAOBJS) Makefile
	ar $(TARGETDIR)/$(PROCESSLIB) $(CUDAOBJS) $(CUDALIB)
$(OBJDIR)/processspec.cpp.o : $(SRCDIR)/processspec.cpp $(C_DEPS)
	$(VERBOSE)$(CXX) $(CXXFLAGS) -o $(OBJDIR)/processspec.cpp.o -c $(SRCDIR)/processspec.cpp
	
$(OBJDIR)/migration.cu.o : $(SRCDIR)/migration.cu $(CU_DEPS)
	$(VERBOSE)$(NVCC) $(NVCCFLAGS) -o $(OBJDIR)/migration.cu.o -c $(SRCDIR)/migration.cu
directories:
	$(VERBOSE)mkdir -p $(OBJDIR)
	$(VERBOSE)mkdir -p $(TARGETDIR)
clean:
	$(VERBOSE)rm -r $(ROOTOBJDIR)
	$(VERBOSE)rm -r $(ROOTBINDIR)
            So it might be useful to other people having the same objective, here some code snippets to build a static library out of a cuda code file, processing.cu, then link a Qt application to that libary. It should be possible to build larger applications on top of this example.
Kind regards,
peter
Header file ./ProcessingLib/processing.h
int processingInit();
int processingExec(char *data);
int processingExit();
Cuda file ./ProcessingLib/processing.cu
int processingInit() {
	printf("processingInit\n");
	//initialisation goes here,
	return 0;
}
int processingExec(char *data) {
	printf("processingExec\n");
	//do your stuff here
	return 0;
}
int processingExit(){
	printf("processingExit\n");
	//cleanup goes here
	return 0;
}
./ProcessingLib/Makefile to generate libProcessingLib.a
PROCESSLIB := libProcessingLib.a
all : $(PROCESSLIB)
CUDA_INSTALL_PATH ?= /usr/local/cuda
NVCC	   := $(CUDA_INSTALL_PATH)/bin/nvcc 
CXX		:= g++
ARCHIVER   := ar cqs
TARGETDIR := ../lib
TARGET := $(TARGETDIR)/$(PROCESSLIB)
CUDASDK_DIR := $(HOME)/NVIDIA_GPU_Computing_SDK/C
CUDASDK_LIBDIR := $(CUDASDK_DIR)/lib
CUDASDK_COMMONINCDIR := $(CUDASDK_DIR)/common/inc
CUDASDK_COMMONLIBDIR := $(CUDASDK_DIR)/common/lib/linux
VERBOSE :=
CUDAINCLUDES  += -I$(CUDA_INSTALL_PATH)/include -I$(CUDASDK_COMMONINCDIR)
COMMONFLAGS += -DUNIX
CXXFLAGS := \
	-W -Wall \
	-Wimplicit \
	-Wswitch \
	-Wformat \
	-Wchar-subscripts \
	-Wparentheses \
	-Wmultichar \
	-Wtrigraphs \
	-Wpointer-arith \
	-Wcast-align \
	-Wreturn-type \
	-Wno-unused-function \
	$(SPACE)
	
NVCCFLAGS := \
	-c -Xopencc \
	-OPT:unroll_size=200000 
# Debug/release configuration
ifeq ($(dbg),1)
	COMMONFLAGS += -g
	NVCCFLAGS   += -D_DEBUG
	CXXFLAGS	+= -D_DEBUG
	CFLAGS	  += -D_DEBUG
	OBJDIR   := debug
	LIBSUFFIX   := D
else 
	COMMONFLAGS += -O2 
	OBJDIR   := release
	LIBSUFFIX   :=
	NVCCFLAGS   += --compiler-options -fno-strict-aliasing
	CXXFLAGS	+= -fno-strict-aliasing
	CFLAGS	  += -fno-strict-aliasing
endif
	
CUDALIB := -L$(CUDA_INSTALL_PATH)/lib64 -L$(CUDASDK_LIBDIR) -L$(CUDASDK_COMMONLIBDIR)
CUDALIB += -lcudart -lcutil ${OPENGLLIB} $(PARAMGLLIB) $(RENDERCHECKGLLIB) $(CUDPPLIB) ${LIB}
# Add common flags
NVCCFLAGS += $(COMMONFLAGS) $(COMMONINCLUDES) $(CUDAINCLUDES)
CFLAGS	+= $(COMMONFLAGS) $(COMMONINCLUDES) 
CXXFLAGS  += $(COMMONFLAGS) $(COMMONINCLUDES) 
CUDAOBJS := \
	$(OBJDIR)/processing.cu.o
$(PROCESSLIB): directories $(CUDAOBJS)
	$(ARCHIVER) $(TARGET) $(CUDAOBJS)
	
$(OBJDIR)/processing.cu.o : processing.cu processing.h $(CU_DEPS)
	$(VERBOSE)$(NVCC) $(NVCCFLAGS) -o $(OBJDIR)/processing.cu.o -c processing.cu
directories:
	$(VERBOSE)mkdir -p $(OBJDIR)
	$(VERBOSE)mkdir -p $(TARGETDIR)
clean:
	$(VERBOSE)rm -r $(OBJDIR)
	$(VERBOSE)rm -r $(TARGET)
Qt project file ./ProcessingTest/ProcessingTest.pro to build a simple application
INCLUDEPATH += ../ProcessingLib
	
CUDA_LIBDIR = /usr/local/cuda/lib64
CUDASDK_LIBDIR = /home/peter/NVIDIA_GPU_Computing_SDK/C/lib
CUDALIB = -L$$CUDA_LIBDIR -L$$CUDASDK_LIBDIR -lcudart -lcutil
QT	   -= gui
TARGET = ProcessLibTest
CONFIG   += console
CONFIG   -= app_bundle
TEMPLATE = app
SOURCES += main.cpp
LIBS += -L../lib -lProcessingLib $$CUDALIB
./ProcessingTest/main.cpp for application
#include <processinglib.h>
int main(){
	char data[1024];
	processingInit();
	processingExec(data);
	processingExit();
}
            So it might be useful to other people having the same objective, here some code snippets to build a static library out of a cuda code file, processing.cu, then link a Qt application to that libary. It should be possible to build larger applications on top of this example.
Kind regards,
peter
Header file ./ProcessingLib/processing.h
int processingInit();
int processingExec(char *data);
int processingExit();
Cuda file ./ProcessingLib/processing.cu
int processingInit() {
	printf("processingInit\n");
	//initialisation goes here,
	return 0;
}
int processingExec(char *data) {
	printf("processingExec\n");
	//do your stuff here
	return 0;
}
int processingExit(){
	printf("processingExit\n");
	//cleanup goes here
	return 0;
}
./ProcessingLib/Makefile to generate libProcessingLib.a
PROCESSLIB := libProcessingLib.a
all : $(PROCESSLIB)
CUDA_INSTALL_PATH ?= /usr/local/cuda
NVCC	   := $(CUDA_INSTALL_PATH)/bin/nvcc 
CXX		:= g++
ARCHIVER   := ar cqs
TARGETDIR := ../lib
TARGET := $(TARGETDIR)/$(PROCESSLIB)
CUDASDK_DIR := $(HOME)/NVIDIA_GPU_Computing_SDK/C
CUDASDK_LIBDIR := $(CUDASDK_DIR)/lib
CUDASDK_COMMONINCDIR := $(CUDASDK_DIR)/common/inc
CUDASDK_COMMONLIBDIR := $(CUDASDK_DIR)/common/lib/linux
VERBOSE :=
CUDAINCLUDES  += -I$(CUDA_INSTALL_PATH)/include -I$(CUDASDK_COMMONINCDIR)
COMMONFLAGS += -DUNIX
CXXFLAGS := \
	-W -Wall \
	-Wimplicit \
	-Wswitch \
	-Wformat \
	-Wchar-subscripts \
	-Wparentheses \
	-Wmultichar \
	-Wtrigraphs \
	-Wpointer-arith \
	-Wcast-align \
	-Wreturn-type \
	-Wno-unused-function \
	$(SPACE)
	
NVCCFLAGS := \
	-c -Xopencc \
	-OPT:unroll_size=200000 
# Debug/release configuration
ifeq ($(dbg),1)
	COMMONFLAGS += -g
	NVCCFLAGS   += -D_DEBUG
	CXXFLAGS	+= -D_DEBUG
	CFLAGS	  += -D_DEBUG
	OBJDIR   := debug
	LIBSUFFIX   := D
else 
	COMMONFLAGS += -O2 
	OBJDIR   := release
	LIBSUFFIX   :=
	NVCCFLAGS   += --compiler-options -fno-strict-aliasing
	CXXFLAGS	+= -fno-strict-aliasing
	CFLAGS	  += -fno-strict-aliasing
endif
	
CUDALIB := -L$(CUDA_INSTALL_PATH)/lib64 -L$(CUDASDK_LIBDIR) -L$(CUDASDK_COMMONLIBDIR)
CUDALIB += -lcudart -lcutil ${OPENGLLIB} $(PARAMGLLIB) $(RENDERCHECKGLLIB) $(CUDPPLIB) ${LIB}
# Add common flags
NVCCFLAGS += $(COMMONFLAGS) $(COMMONINCLUDES) $(CUDAINCLUDES)
CFLAGS	+= $(COMMONFLAGS) $(COMMONINCLUDES) 
CXXFLAGS  += $(COMMONFLAGS) $(COMMONINCLUDES) 
CUDAOBJS := \
	$(OBJDIR)/processing.cu.o
$(PROCESSLIB): directories $(CUDAOBJS)
	$(ARCHIVER) $(TARGET) $(CUDAOBJS)
	
$(OBJDIR)/processing.cu.o : processing.cu processing.h $(CU_DEPS)
	$(VERBOSE)$(NVCC) $(NVCCFLAGS) -o $(OBJDIR)/processing.cu.o -c processing.cu
directories:
	$(VERBOSE)mkdir -p $(OBJDIR)
	$(VERBOSE)mkdir -p $(TARGETDIR)
clean:
	$(VERBOSE)rm -r $(OBJDIR)
	$(VERBOSE)rm -r $(TARGET)
Qt project file ./ProcessingTest/ProcessingTest.pro to build a simple application
INCLUDEPATH += ../ProcessingLib
	
CUDA_LIBDIR = /usr/local/cuda/lib64
CUDASDK_LIBDIR = /home/peter/NVIDIA_GPU_Computing_SDK/C/lib
CUDALIB = -L$$CUDA_LIBDIR -L$$CUDASDK_LIBDIR -lcudart -lcutil
QT	   -= gui
TARGET = ProcessLibTest
CONFIG   += console
CONFIG   -= app_bundle
TEMPLATE = app
SOURCES += main.cpp
LIBS += -L../lib -lProcessingLib $$CUDALIB
./ProcessingTest/main.cpp for application
#include <processinglib.h>
int main(){
	char data[1024];
	processingInit();
	processingExec(data);
	processingExit();
}