接着前面有篇文章介绍在windows上面对他们进行合成,这篇文章我们介绍下在ubuntu上面对其合成。
程序用的是brown大学里面snow-master,该project包括了几个项目,其中有个CUDA_helloworld刚好可以拿来练手
CUDA在ubuntu上面的安装我就不多介绍,攻略帖一大堆
下面开始介绍下这个项目
main.cpp内容如下:
#include <QCoreApplication>
extern "C" // tell compiler that function is defined somewhere else
void runCudaPart();
#include <stdio.h>
int main(int argc, char *argv[])
{
QCoreApplication a(argc, argv);
runCudaPart();
return a.exec();
}
kernel.cu内容如下:
#include <cuda.h>
#include <glm/glm.hpp>
#include <stdio.h>
#if defined(__CUDA_ARCH__) && (__CUDA_ARCH__ < 200)
# error printf is only supported on devices of compute capability 2.0 and higher, please compile with -arch=sm_20 or higher
#endif
extern "C"
void runCudaPart();
__global__ void helloCUDA(glm::vec3 v)
{
int tid = blockIdx.x;
printf("Hello block %d thread %d, x=%f\n",tid , threadIdx.x, v.x);
}
void runCudaPart()
{
// all your cuda code here
glm::vec3 v(0.1f, 0.2f, 0.3f);
// helloCUDA<<<1, 5>>>(v); // 1 block, 5 GPU threads
helloCUDA<<<5,1>>>(v); // 5 blocks, 1 GPU thread each
cudaDeviceSynchronize();
}
其中项目的pro文件如下:
#-------------------------------------------------
#
# Project created by QtCreator 2014-04-03T18:12:01
#
#-------------------------------------------------
QT += core
QT -= gui
TARGET = CUDA_helloworld
CONFIG += console
CONFIG -= app_bundle
TEMPLATE = app
SOURCES += main.cpp
# GLM
INCLUDEPATH += /usr/local/glm
# C++ flag
QMAKE_CXXFLAGS_RELEASE=-O3
# CUDA stuff
CUDA_SOURCES += kernel.cu
# uncomment below to also import include CUDA SDK
#CUDA_SDK = /contrib/projects/cuda-sdk/C
#INCLUDEPATH += $$CUDA_SDK/common/inc/
#INCLUDEPATH += $$CUDA_SDK/../shared/inc/
#QMAKE_LIBDIR += $$CUDA_SDK/lib
#QMAKE_LIBDIR += $$CUDA_SDK/common/lib
CUDA_DIR = /usr/local/cuda-7.5
INCLUDEPATH += $$CUDA_DIR/include
QMAKE_LIBDIR += $$CUDA_DIR/lib64
#LD_LIBRARY_PATH=$${LD_LIBRARY_PATH}:$$CUDA_DIR/lib64
#message($${LD_LIBRARY_PATH})
#$$(PATH) = $$(PATH):$$CUDA_DIR/bin
#message($$(PATH))
LIBS += -lcudart -lcuda
OTHER_FILES += \
CUDA_notes.txt \
kernel.cu
# GPU ARCH
# this gets passed as the gpu-architecture flag to nvcc compiler
# specifying particular architectures enable certain features, limited to the compute capability
# of the GPU. compute capabilities listed here http://en.wikipedia.org/wiki/CUDA
# MSLAB GeForce 460 seems to have compute capability 2.1
CUDA_ARCH = sm_21
# custom NVCC flags
NVCCFLAGS = --compiler-options -fno-strict-aliasing -use_fast_math --ptxas-options=-v
# Prepare the extra compiler configuration (taken from the nvidia forum - i'm not an expert in this part)
CUDA_INC = $$join(INCLUDEPATH,' -I','-I',' ')
# compile CUDA kernels using nvcc
cuda.commands = $$CUDA_DIR/bin/nvcc -m64 -g -G -arch=$$CUDA_ARCH -c $$NVCCFLAGS $$CUDA_INC $$LIBS ${QMAKE_FILE_NAME} -o ${QMAKE_FILE_OUT} \
2>&1 | sed -r \"s/\\(([0-9]+)\\)/:\\1/g\" 1>&2
# Prepare the extra compiler configuration (taken from the nvidia forum - i'm not an expert in this part)
cuda.input = CUDA_SOURCES
cuda.output = ${OBJECTS_DIR}${QMAKE_FILE_BASE}_cuda.o # suffix needed for this to work?
# Tell Qt that we want add more stuff to the Makefile
QMAKE_EXTRA_UNIX_COMPILERS += cuda
配置好后运行,会出现
libcudart.so.7.5: cannot open shared object file: No such file or directory
网上搜了下,解决方法如下
在shell中输入:
32-bit: sudo ldconfig /usr/local/cuda-7.5/lib
64-bit: sudo ldconfig /usr/local/cuda-7.5/lib64
cheers!