CUDA 編程是非常傻瓜式的C程序形帮。比較麻煩的是需要把環(huán)境配好吧寺。
在Linux環(huán)境上面就比較容易配環(huán)境梗逮。
首先需要安裝CUDA driver隅津。
# 查看一下 當(dāng)前機(jī)器支持的drivers诬垂,選那個(gè)recommend的就行
sudo ubuntu-drivers devices
# 這個(gè)需要卸載一些部件,安裝一些部件伦仍,在ubuntu上面可能導(dǎo)致無(wú)法開(kāi)機(jī)结窘,建議不要在工作機(jī)上面搞,風(fēng)險(xiǎn)太大
sudo aptitude install nvidia-driver-535
接著可能還需要安裝nvidia-development-tookit
sudo aptitude install nvidia-cuda-toolkit
這樣搞完驗(yàn)證一下顯卡驅(qū)動(dòng)充蓝,
nvidia-smi
如果輸出如下隧枫,就應(yīng)該可以上車(chē)了。
---------------------------------------------------------------------------------------+
| NVIDIA-SMI 535.86.05 Driver Version: 535.86.05 CUDA Version: 12.2 |
|-----------------------------------------+----------------------+----------------------+
| GPU Name Persistence-M | Bus-Id Disp.A | Volatile Uncorr. ECC |
| Fan Temp Perf Pwr:Usage/Cap | Memory-Usage | GPU-Util Compute M. |
| | | MIG M. |
|=========================================+======================+======================|
| 0 NVIDIA GeForce MX130 Off | 00000000:01:00.0 Off | N/A |
| N/A 50C P5 N/A / 200W | 330MiB / 2048MiB | 13% Default |
| | | N/A |
+-----------------------------------------+----------------------+----------------------
接下來(lái)如果是ubuntu 20.04谓苟,可能還需要降級(jí)一下GCC9到GCC8官脓。
可以采用如下頁(yè)面展示的方法來(lái)解決。
https://blog.csdn.net/weixin_42217899/article/details/126814206
然后就可以使用CMake來(lái)編譯CUDA程序了涝焙。
本文使用conan來(lái)做包管理卑笨。
conanfile.txt
[requires]
boost/1.72.0
opencv/4.5.5
[generators]
cmake
CMakeLists.txt
cmake_minimum_required(VERSION 3.3)
project(1_simpe_add)
set(ENV{PKG_CONFIG_PATH} "$ENV{PKG_CONFIG_PATH}:/usr/local/lib/pkgconfig/")
set ( CMAKE_CXX_FLAGS "-pthread")
set(CMAKE_CXX_STANDARD 17)
add_definitions(-g)
include(${CMAKE_BINARY_DIR}/conanbuildinfo.cmake)
conan_basic_setup()
find_package(CUDA)
include_directories(${INCLUDE_DIRS})
LINK_DIRECTORIES(${LINK_DIRS})
if (CUDA_FOUND)
file( GLOB main_file_list ${CMAKE_CURRENT_SOURCE_DIR}/*.cu)
foreach( main_file ${main_file_list} )
file(RELATIVE_PATH filename ${CMAKE_CURRENT_SOURCE_DIR} ${main_file})
string(REPLACE ".cu" "" file ${filename})
CUDA_ADD_EXECUTABLE(${file} ${main_file})
target_link_libraries(${file} ${CUDA_LINK_LIBRARIES_KEYWORD} pthread)
target_link_libraries(${file} ${CUDA_LINK_LIBRARIES_KEYWORD} ${CONAN_LIBS})
endforeach( main_file ${main_file_list})
else()
message("CUDA not found!")
endif()
utilities.h
#ifndef _FREDRIC_UTILITIES_H_
#define _FREDRIC_UTILITIES_H_
#include "cuda.h"
#include <stdio.h>
static void HandleError(cudaError_t err,
char const* file,
int line) {
if(err != cudaSuccess) {
printf("%s in %s at line %d\n", cudaGetErrorString(err), file, line);
exit(EXIT_FAILURE);
}
}
#define HANDLE_ERROR(err) (HandleError(err, __FILE__, __LINE__))
#endif
simple_add.cu
#include <iostream>
#include <string>
#include <sstream>
#include <utility>
#include <memory>
#include "utilities.h"
#include <boost/lexical_cast.hpp>
__device__ int addem(int a, int b) {
return a+b;
}
__global__ void add(int a, int b, int *c) {
*c = addem(a, b);
}
int main(int argc, char* argv[]) {
int c;
int *dev_c;
HANDLE_ERROR(cudaMalloc((void**)&dev_c, sizeof(int)));
add<<<1, 1>>>(2, 7, dev_c);
HANDLE_ERROR(cudaMemcpy(&c, dev_c, sizeof(int), cudaMemcpyDeviceToHost));
std::cout << "2 + 7 = " << c << "\n";
HANDLE_ERROR(cudaFree(dev_c));
return EXIT_SUCCESS;
}
程序會(huì)簡(jiǎn)單的在 GPU上計(jì)算2+7=9,然后把結(jié)果 拷貝回CPU仑撞,使用std::cout進(jìn)行輸出赤兴。