首先装CUDA,具体查看其它博客,这里主要介绍如何配置。
CONFIG += console
TARGET = test
# Define output directories
CUDA_OBJECTS_DIR = ./
# This makes the .cu files appear in your project
CUDA_SOURCES += \
kernel.cu
CUDA_DIR = "/usr/local/cuda"
CUDA_RUNTIME = "/usr/local/cuda-11.0/targets/x86_64-linux"
# CUDA settings
SYSTEM_TYPE = 64 # '32' or '64', depending on your system
NVCC_OPTIONS = --use_fast_math
#CUDA_ARCH = sm_50 # Type of CUDA architecture
# https://arnon.dk/matching-sm-architectures-arch-and-gencode-for-various-nvidia-cards/
CUDA_ARCH = -gencode arch=compute_61,code=sm_61 \ # for Pascal architecture
-gencode arch=compute_75,code=sm_75 \ # for Turing architecture
-gencode arch=compute_75,code=compute_75
# include paths
INCLUDEPATH += $$CUDA_RUNTIME/include \
$$CUDA_DIR/include \
# library directories
CUDA_OBJECTS_DIR = ./
CUDA_LIBS += -L$$CUDA_DIR/lib64 -lcudart -lcusolver -lcuda -lcufft -lcublas -lcurand -lcudnn -lnvidia-ml -lstdc++
QMAKE_LIBDIR += $$CUDA_LIBS
# The following makes sure all path names (which often include spaces) are put between quotation marks
CUDA_INC = $$join(INCLUDEPATH,'" -I"','-I"','"')
LIBS += $$CUDA_LIBS
# Configuration of the Cuda compiler
CONFIG(debug, debug|release) {
# Debug mode
cuda_d.input = CUDA_SOURCES
cuda_d.output = $$CUDA_OBJECTS_DIR/${QMAKE_FILE_BASE}_cuda.obj
cuda_d.commands = $$CUDA_DIR/bin/nvcc -D_DEBUG $$NVCC_OPTIONS $$CUDA_INC \
--machine $$SYSTEM_TYPE $$CUDA_ARCH \
-c -o ${QMAKE_FILE_OUT} ${QMAKE_FILE_NAME}
cuda_d.dependency_type = TYPE_C
QMAKE_EXTRA_COMPILERS += cuda_d
}
else {
# Release mode CUDA settings
cuda_d.input = CUDA_SOURCES
cuda_d.output = $$CUDA_OBJECTS_DIR/${QMAKE_FILE_BASE}_cuda.obj
cuda_d.commands = $$CUDA_DIR/bin/nvcc $$NVCC_OPTIONS $$CUDA_INC \
--machine $$SYSTEM_TYPE $$CUDA_ARCH \
-c -o ${QMAKE_FILE_OUT} ${QMAKE_FILE_NAME}
cuda_d.dependency_type = TYPE_C
QMAKE_EXTRA_COMPILERS += cuda_d
}
SOURCES += \
main.cpp
然后创建两个file,main.cpp和kernal.cu
main.cpp
#include <QtCore/QCoreApplication>
extern "C" void runCudaPart();
int main(int argc, char *argv[]) {
printf("hello");
runCudaPart();
}
kernal.cu
// CUDA-C includes
#include <cuda.h>
#include <cuda_runtime.h>
#include <stdio.h>
extern "C"
//Adds two arrays
void runCudaPart();
__global__ void addAry( int * ary1, int * ary2 )
{
int indx = threadIdx.x;
ary1[ indx ] += ary2[ indx ];
}
// Main cuda function
void runCudaPart() {
int ary1[32];
int ary2[32];
int res[32];
for( int i=0 ; i<32 ; i++ )
{
ary1[i] = i;
ary2[i] = 2*i;
res[i]=0;
}
int * d_ary1, *d_ary2;
cudaMalloc((void**)&d_ary1, 32*sizeof(int));
cudaMalloc((void**)&d_ary2, 32*sizeof(int));
cudaMemcpy((void*)d_ary1, (void*)ary1, 32*sizeof(int), cudaMemcpyHostToDevice);
cudaMemcpy((void*)d_ary2, (void*)ary2, 32*sizeof(int), cudaMemcpyHostToDevice);
addAry<<<1,32>>>(d_ary1,d_ary2);
cudaMemcpy((void*)res, (void*)d_ary1, 32*sizeof(int), cudaMemcpyDeviceToHost);
for( int i=0 ; i<32 ; i++ )
printf( "result[%d] = %d\n", i, res[i]);
cudaFree(d_ary1);
cudaFree(d_ary2);
}
这是编译成功后的信息
21:37:56: Running steps for project cudalearn1...
21:37:56: Configuration unchanged, skipping qmake step.
21:37:56: Starting: "/usr/bin/make" -j12
/opt/Qt5.13.0/5.13.0/gcc_64/bin/qmake -o Makefile ../cudalearn1/cudalearn1.pro -spec linux-g++ CONFIG+=qtquickcompiler
/usr/local/cuda/bin/nvcc --use_fast_math -I"/usr/local/cuda-11.0/targets/x86_64-linux/include" -I"/usr/local/cuda/include" -L/usr/local/cuda/lib64 -lcudart -lcusolver -lcuda -lcufft -lcublas -lcurand -lcudnn -lnvidia-ml -lstdc++ --machine 64 -gencode arch=compute_61,code=sm_61 -gencode arch=compute_75,code=sm_75 -gencode arch=compute_75,code=compute_75 -c -o kernel_cuda.obj ../cudalearn1/kernel.cu
g++ -c -pipe -O2 -Wall -W -D_REENTRANT -fPIC -DQT_NO_DEBUG -DQT_GUI_LIB -DQT_CORE_LIB -I../cudalearn1 -I. -I/usr/local/cuda-11.0/targets/x86_64-linux/include -I/usr/local/cuda/include -I/opt/Qt5.13.0/5.13.0/gcc_64/include -I/opt/Qt5.13.0/5.13.0/gcc_64/include/QtGui -I/opt/Qt5.13.0/5.13.0/gcc_64/include/QtCore -I. -isystem /usr/include/libdrm -I/opt/Qt5.13.0/5.13.0/gcc_64/mkspecs/linux-g++ -o main.o ../cudalearn1/main.cpp
g++ -Wl,-O1 -Wl,-rpath,/opt/Qt5.13.0/5.13.0/gcc_64/lib -o test kernel_cuda.obj main.o -L-L/usr/local/cuda/lib64 -L-lcudart -L-lcusolver -L-lcuda -L-lcufft -L-lcublas -L-lcurand -L-lcudnn -L-lnvidia-ml -L-lstdc++ -L/usr/local/cuda/lib64 -lcudart -lcusolver -lcuda -lcufft -lcublas -lcurand -lcudnn -lnvidia-ml -lstdc++ /opt/Qt5.13.0/5.13.0/gcc_64/lib/libQt5Gui.so /opt/Qt5.13.0/5.13.0/gcc_64/lib/libQt5Core.so -lGL -lpthread
21:37:57: The process "/usr/bin/make" exited normally.
21:37:57: Elapsed time: 00:01.
运行的时候只能在release下运行,有些童鞋在debug下一运行,程序就崩溃,就是在qt下debug运行内存段错误了,非要debug下运行,那么就在debug编译后去命令行去运行。