1. 程式人生 > >Cmake+Ubuntu+CUDA+C混合編譯

Cmake+Ubuntu+CUDA+C混合編譯

一. 環境Jetson TK1 開發套件+Ubuntu 14.04Cmake安裝:sudo apt-get install cmake二.示例1.目錄樹

2.原始碼
/cuda/cube.cu
#include "cuda_runtime.h"
#include "device_launch_parameters.h"
#include <stdio.h>
#include "cube.cuh"

__global__ void cube_core(int *dev_a, int *dev_b){
	int tid=blockIdx.x;
	int tmp=*(dev_a+tid);
	*(dev_b+tid)=tmp*tmp*tmp;	
}


void cube(int result[], int n){
	int a[n];
	for(int i=0;i<n;i++){
		a[i]=i;	
	}	
	int *dev_a=NULL;
	int *dev_b=NULL;
	cudaMalloc((void**)&dev_a,n*sizeof(int));
	cudaMemset((void**)&dev_a,0,n*sizeof(int));
	cudaMalloc((void**)&dev_b,n*sizeof(int));
	cudaMemset((void**)&dev_b,0,n*sizeof(int));
	cudaMemcpy(dev_a,(void**)&a,n*sizeof(int),cudaMemcpyHostToDevice);
	cube_core<<<n,1>>>(dev_a,dev_b);
	cudaMemcpy((void **)&result[0],dev_b,n*sizeof(int),cudaMemcpyDeviceToHost);
}
/cuda/cu.cuh
#ifndef CUBE_H
	#define CUBE_H
	extern "C" void cube(int *result, int n);
#endif
/cuda/CMakeLists.txt
project(CUBE)
cmake_minimum_required(VERSION 2.8)
find_package(CUDA REQUIRED)

file(GLOB_RECURSE CURRENT_HEADERS *.cuh)
file(GLOB CURRENT_SOURCES *.cu)

list(APPEND CUDA_NVCC_FLAGS "-std=c++11")

source_group("Include" FILES ${CURRENT_HEADERS})
source_group("Source" FILES ${CURRENT_SOURCES})

cuda_add_library(cube STATIC ${CURRENT_HEADERS} ${CURRENT_SOURCES})

#not used in this demo
TARGET_LINK_LIBRARIES(cube pthread)
TARGET_LINK_LIBRARIES(cube cufft)
TARGET_LINK_LIBRARIES(cube pcap)
/src/print.c
#include<stdio.h>
#include"print.h"

void print(int *a, int n){
	printf("\tHola\n");
	for(int i=0;i<n;i++)
		printf("    %d\n",*(a+i));
	printf("\tAdios\n");
}
/src/print.h
#ifndef PRINT_H
	#define PRINT_H
	extern "C" void print(int *a, int n);
#endif
/src/CMakeLists.txt
project(PRINT)
cmake_minimum_required(VERSION 2.8)

file(GLOB_RECURSE CURRENT_HEADERS *.h)
file(GLOB CURRENT_SOURCES *.c)

set(CMAKE_C_COMPILER g++)
list(APPEND CMAKE_C_FLAGS "-lstdc++")

#source_group("Include" FILES ${CURRENT_HEADERS})
#source_group("Source" FILES ${CURRENT_SOURCES})

add_library(print STATIC ${CURRENT_HEADERS} ${CURRENT_SOURCES})
/main.c
#include<stdio.h>
extern "C" void cube(int *a, int n);
extern "C" void print(int *a, int n);

int main(){
	int N=10;
	int a[10];
	cube(a,N);
	print(&a[0],N);
}
/CMakeLists.txt
project(PRO)
cmake_minimum_required(VERSION 2.8)
add_subdirectory(cuda ./cuda/bin)
add_subdirectory(src ./src/bin)
set(EXTRA_LIBS ${EXTRA_LIBS} cube print)
SET(CMAKE_C_COMPILER g++)
list(APPEND CMAKE_C_FLAGS "-lstdc++")

add_executable(pro main.c)
target_link_libraries(pro ${EXTRA_LIBS})
3.切換到build目錄,編譯,連結,執行
cd build
cmake ..
make
./pro
4.結果


三.問題及解決
1.-lcufft not found
拷貝cuda庫裡面的libcufft檔案,並生成軟連結
sudo cp  /usr/local/cuda-6.5/lib/libcufft.so.6.5.53 	/usr/lib/arm-linux-gnueabihf/libcufft.so.6.5.53
sudo ln –s /usr/lib/arm-linux-gnueabihf/libcufft.so.6.5.53 /usr/lib/arm-linux-gnueabihf/libcufft.so.6.5
sudo ln –s /usr/lib/arm-linux-gnueabihf/libcufft.so.6.5  /usr/lib/arm-linux-gnueabihf/libcufft.so
2./usr/bin/ld:cuda/libgpu.a(gpu_generated_active.cu.o): undefined reference to symbol '[email protected]@GLIBCXX_3.4'

//usr/lib/arm-linux-gnueabihf/libstdc++.so.6:error adding symbols: DSO missing from command line

CMakeLists.txt新增:set(CMAKE_C_COMPILER g++)# gcc使用c++庫。

注意:直接用gcc進行連結時,-lstdc++放在最後,因為gcc是按從右到左的順序查詢依賴庫的。
3./home/ubuntu/Documents/Active/active_uart/cuda/active.cu(1535): error:namespace "std" has no member "to_string"
/cuda/CMakeLists.txt 新增:list(APPEND CUDA_NVCC_FLAGS “-std=c++11”)

相關推薦

Cmake+Ubuntu+CUDA+C混合編譯

一. 環境Jetson TK1 開發套件+Ubuntu 14.04Cmake安裝:sudo apt-get install cmake二.示例1.目錄樹2.原始碼/cuda/cube.cu#include "cuda_runtime.h" #include "device_l

VS2010中CUDAC++混合編譯(兩種方式)

在做專案整合的時候需要用到cpp和cuda檔案聯調,自己摸索了兩種方式實現cpp和cu檔案混合編譯。 本文環境: windows7 64位VS2010CUDA5.5英偉達顯示卡Tesla C1060 前言 裝好CUDA 5.5 sdk後,預設會自動新增好系統環境變數

VS2010 CUDAC++混合編譯

在做專案整合的時候需要用到cpp和cuda檔案聯調,自己摸索了兩種方式實現cpp和cu檔案混合編譯。 本文環境: windows7 64位VS2010CUDA5.5英偉達顯示卡Tesla C1060 前言 裝好CUDA 5.5 sdk後,預設會自動新增好系統環境變數。 因此不需要額外配置,不過

CC++混合編譯

C語言與C++的函式編譯後的命名規則不同,因此在C++工程中直接引用C實現的原始碼會存在“undefined reference”問題,即找不到函式的實現。 因此,在C的標頭檔案前,應使用extern “C”提示編譯器,該程式碼是使用C語言進行編寫的,如以下形式: ext

STM32cubeMX改C/C++混合編譯

首先說明一下,本文的開發環境是linux,基於STM32cubeMX生成工程新增C++部分程式碼和選項。寫給微控制器開發windows轉linux新手,高手略過。cubeMX生成工程預設是C語言,還有一部分彙編。首先加入file.cpp到工程,在Middlewares下新建c

16bit C & ASM 如何混合編譯

.exe 資料 bit urb 價值 nmake 開發 include 生成 起源: 今天在看以前沒看完的一本書《圖形程序開發人員指南》,在做裏面的例子。 第一章就出問題了,一個例子“L1_2.c, L1_3.asm" ,這是C程序和ASM匯編程序的混合編譯

Ubuntu下怎麽編譯並運行CC++和Pascal語言?

tro 開始 用戶 步驟 ide gcc 但是 col inf 很多同學在安裝了Ubuntu的環境後,發現在Windows下的許多東西都打不開了,但是用網站上的在線IDE又不是很方便。 所以,ljn教你如何在Ubuntu下編譯並運行C、C++和Pascal。 一.編譯並

c++與matlab混合編譯———讀取mxArray內容

            mxArray作為一種特殊且複雜的資料結構,需要通過matrix.h提供的相關介面去訪問。在混合編譯過程中,matlab變數以mxArray形式儲存,通常用mxArray* 型別來指定matlab工作空間變數的地

Ubuntu下編輯並編譯執行c++程式

一、使用vim編輯c++程式碼: vim hello.cpp 輸入如下程式碼: #include <iostream> using namespace std; int main() { cout<<"Hello world!"<<endl;

ubuntuc/c++/python/go編譯執行

  C語言: .c檔案 編譯器gcc//my_code下hello.c檔案 $sudo apt install gcc $gcc hello.c -o hello $./hello   C++: .cpp檔案 編譯器g++//my_code下hello.cpp檔案

ubuntuc/c++/python/go編譯運行

工程 ubunt ubuntu下 python 執行 ++ blog 當前 com C語言: .c文件 編譯器gcc//my_code下hello.c文件 $sudo apt install gcc $gcc hello.c -o hello $./hello

ubuntuc++編譯連結caffe的工程

最近在做深度網路相關的專案,我們通常可以從github上download很多相關的原始碼,但是在我們的機子上編譯的時候通常會遇到很多問題,將我最近踩的坑做了一些總結,希望對大家有所幫助。 1.如果直接g++  ×××.cpp 出現下面或者是出現某種語法錯誤之類的 [Cli

ubuntuC++多執行緒程式設計(cmake生成makefile)

最近做專案要用到多執行緒的程式設計,又要用到opencv因此採用cmake生成makefile然後進行編譯的方法比較簡單。這裡給出多執行緒的簡單例項。 主函式非常簡單: #include <iostream> #include <pthread.h&g

在Windows下使用CMake+MinGW搭建C/C++編譯環境

1.1 MinGWMinGW 是一個可自由使用和自由釋出的Windows特定標頭檔案和使用GNU工具集匯入庫的集合,允許你生成本地的Windows程式而不需要第三方C執行時庫。簡單說,MinGW是一個編譯環境,包含了C++程式碼編譯過程中需要的三方庫、標頭檔案……用於完成C+

MATLAB和C++編譯器混合編譯:Xcode 8的不相容錯誤

最近在看tracking方面的論文和程式碼,發現大多數都是用matlab和c++混合編譯的。對於linux和windows這兩個系統,暫時還沒有碰到編譯器不相容的問題,但是mac上面卻有問題,在命令列裡輸入: mex -setup 會有下面的錯誤提示:

混合編譯c++檔案呼叫c檔案變數和函式、c檔案呼叫c++檔案變數和函式

1.c++檔案呼叫c檔案變數和函式 前言:以前見到extern "C"這樣的語句,只是簡單地知道跟外部連結有關,但是沒有深刻理解它的意思。 首先,為什麼要使用extern "C"修飾符? C++呼叫其它語言的函式,由於編譯器生成函式的機制不一樣,所以需要經過特殊處理,才可以

CC++的混合編譯--extern “C”的使用

參考地址:http://www.cnblogs.com/skynet/archive/2010/07/10/1774964.html 在實際程式設計中,有時會需要用到C\C++的混合編譯,通過extern “C”即可實現混合編譯,以下是個人蔘照網友的資料以及自己的實際操作

Swift和Objective-C混合編程——Swift調用OC

分享 發現 load 另一個 == 方法 代碼 swift 應用 在iOS應用的開發中。Swift必將代替OC,兩者的趨勢是“短期共存,長期代替”。但曾經有太多的代碼是用OC語言完畢的,而Swift的開發也從 OC中繼承了非常多的特性。兩者也是有非常多的類

Ubuntu下配置交叉編譯環境

conf core chains 編譯 配置 -c 進行 spa 編譯環境 [email protected]/* */:~$ sudo apt-get update # 如果不安裝 gawk subversion wine1.6-dev 編譯會報錯 [ema

Swift 4 和 Objective-C 混合編程(一) 快速起步

命名方式 import 編譯器 選擇性 工程 Swift 4 和 Objective-C 在同一個工程裏的混搭編程的方法你可以在 xcode 裏同時使用 Swift 和 Objective-C(以下簡稱OC)來寫代碼,混搭編程的好處很多,比如允許大量代碼的復用,在性能和開發效率之間找到平衡