CUDA 编程是非常傻瓜式的C程序。比较麻烦的是需要把环境配好。
在Linux环境上面就比较容易配环境。
首先需要安装CUDA driver。
# 查看一下 当前机器支持的drivers,选那个recommend的就行
sudo ubuntu-drivers devices
# 这个需要卸载一些部件,安装一些部件,在ubuntu上面可能导致无法开机,建议不要在工作机上面搞,风险太大
sudo aptitude install nvidia-driver-535
接着可能还需要安装nvidia-development-tookit
sudo aptitude install nvidia-cuda-toolkit
这样搞完验证一下显卡驱动,
nvidia-smi
如果输出如下,就应该可以上车了。
---------------------------------------------------------------------------------------+
| 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 |
+-----------------------------------------+----------------------+----------------------
接下来如果是ubuntu 20.04,可能还需要降级一下GCC9到GCC8。
可以采用如下页面展示的方法来解决。
https://blog.csdn.net/weixin_42217899/article/details/126814206
然后就可以使用CMake来编译CUDA程序了。
本文使用conan来做包管理。
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;
}
程序会简单的在 GPU上计算2+7=9,然后把结果 拷贝回CPU,使用std::cout进行输出。
网友评论