使用CMake構(gòu)建一個(gè)簡(jiǎn)單的CUDA 加法程序

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)行輸出赤兴。

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末妖滔,一起剝皮案震驚了整個(gè)濱河市,隨后出現(xiàn)的幾起案子桶良,更是在濱河造成了極大的恐慌座舍,老刑警劉巖,帶你破解...
    沈念sama閱讀 218,386評(píng)論 6 506
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件艺普,死亡現(xiàn)場(chǎng)離奇詭異簸州,居然都是意外死亡,警方通過(guò)查閱死者的電腦和手機(jī)歧譬,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,142評(píng)論 3 394
  • 文/潘曉璐 我一進(jìn)店門(mén)岸浑,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái),“玉大人瑰步,你說(shuō)我怎么就攤上這事矢洲。” “怎么了缩焦?”我有些...
    開(kāi)封第一講書(shū)人閱讀 164,704評(píng)論 0 353
  • 文/不壞的土叔 我叫張陵读虏,是天一觀的道長(zhǎng)。 經(jīng)常有香客問(wèn)我袁滥,道長(zhǎng)盖桥,這世上最難降的妖魔是什么? 我笑而不...
    開(kāi)封第一講書(shū)人閱讀 58,702評(píng)論 1 294
  • 正文 為了忘掉前任题翻,我火速辦了婚禮狭郑,結(jié)果婚禮上酬荞,老公的妹妹穿的比我還像新娘赐稽。我一直安慰自己忽妒,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,716評(píng)論 6 392
  • 文/花漫 我一把揭開(kāi)白布姜挺。 她就那樣靜靜地躺著齿税,像睡著了一般。 火紅的嫁衣襯著肌膚如雪炊豪。 梳的紋絲不亂的頭發(fā)上凌箕,一...
    開(kāi)封第一講書(shū)人閱讀 51,573評(píng)論 1 305
  • 那天,我揣著相機(jī)與錄音词渤,去河邊找鬼陌知。 笑死,一個(gè)胖子當(dāng)著我的面吹牛掖肋,可吹牛的內(nèi)容都是我干的仆葡。 我是一名探鬼主播,決...
    沈念sama閱讀 40,314評(píng)論 3 418
  • 文/蒼蘭香墨 我猛地睜開(kāi)眼,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼沿盅!你這毒婦竟也來(lái)了把篓?” 一聲冷哼從身側(cè)響起,我...
    開(kāi)封第一講書(shū)人閱讀 39,230評(píng)論 0 276
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤腰涧,失蹤者是張志新(化名)和其女友劉穎韧掩,沒(méi)想到半個(gè)月后,有當(dāng)?shù)厝嗽跇?shù)林里發(fā)現(xiàn)了一具尸體窖铡,經(jīng)...
    沈念sama閱讀 45,680評(píng)論 1 314
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡疗锐,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,873評(píng)論 3 336
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了费彼。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片滑臊。...
    茶點(diǎn)故事閱讀 39,991評(píng)論 1 348
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡,死狀恐怖箍铲,靈堂內(nèi)的尸體忽然破棺而出雇卷,到底是詐尸還是另有隱情,我是刑警寧澤颠猴,帶...
    沈念sama閱讀 35,706評(píng)論 5 346
  • 正文 年R本政府宣布关划,位于F島的核電站,受9級(jí)特大地震影響翘瓮,放射性物質(zhì)發(fā)生泄漏贮折。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,329評(píng)論 3 330
  • 文/蒙蒙 一资盅、第九天 我趴在偏房一處隱蔽的房頂上張望调榄。 院中可真熱鬧,春花似錦律姨、人聲如沸振峻。這莊子的主人今日做“春日...
    開(kāi)封第一講書(shū)人閱讀 31,910評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)。三九已至烫堤,卻和暖如春荣赶,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背鸽斟。 一陣腳步聲響...
    開(kāi)封第一講書(shū)人閱讀 33,038評(píng)論 1 270
  • 我被黑心中介騙來(lái)泰國(guó)打工拔创, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人富蓄。 一個(gè)月前我還...
    沈念sama閱讀 48,158評(píng)論 3 370
  • 正文 我出身青樓剩燥,卻偏偏與公主長(zhǎng)得像,于是被迫代替她去往敵國(guó)和親。 傳聞我的和親對(duì)象是個(gè)殘疾皇子灭红,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,941評(píng)論 2 355

推薦閱讀更多精彩內(nèi)容