ubuntu18.04下cuda.cu在c/c++中的三种使用方式(代码片段)

每天看一遍,防止恋爱&&堕落 每天看一遍,防止恋爱&&堕落     2022-12-22     252

关键词:

操作系统

ubuntu 18.04

前提

想要在.c文件中使用cuda的函数,即.cu的内容

安装nvcc不是这里的内容,但是确保能使用nvcc,这是保证能编译.cu的前提,查看nvcc的版本命令如下

nvcc --version

输出内容如下

nvcc: NVIDIA (R) Cuda compiler driver
Copyright (c) 2005-2017 NVIDIA Corporation
Built on Fri_Nov__3_21:07:56_CDT_2017
Cuda compilation tools, release 9.1, V9.1.85

第一种方式使用cuda函数

第一种方式,则是通过采用lib的形式来使用cuda的函数

foo文件中使用了5个gpu线程,来执行核函数foo

文件的内容如下

foo.h内容如下,加上ifdef是为了方便我们引入,在.c调用的时候如果不去掉extern则会报错

#ifndef FOO_CUH
#define FOO_CUH

#include <stdio.h>

//__global__ void foo();

#ifdef EXPORTS
extern "C"
#endif
void useCUDA();


#endif

foo.cu内容如下

#define EXPORTS

#include "foo.h"

#define CHECK(res)  if(res != cudaSuccess)printf("Error :%s:%d , ", __FILE__,__LINE__);   \\
printf("code : %d , reason : %s \\n", res,cudaGetErrorString(res));exit(-1);

__global__ void foo()

    printf("CUDA!\\n");



void useCUDA()

    foo<<<1,5>>>();
    printf("CUDA zeng!\\n");
    CHECK(cudaDeviceSynchronize());

main.c内容如下

#include <stdio.h>
#include "foo.h"

int main()

    useCUDA();
    return 0;

开始编译

用nvcc将foo编译成.a库

nvcc -c foo.cu -o foo.o
ar cr libfoo.a foo.o

查看一下.a是否导出了对应的符号

nm -g --defined-only libfoo.a

可以看到正确导出了

链接libfoo.a并编译main.c

gcc main.c -o main libfoo.a -lcudart -lcuda -lstdc++

执行生成的main

.main

可以看到输出如下

如果main是cpp,则可以使用如下命令

g++ main.cpp -o main libfoo.a -lcudart -lcuda -lstdc++

整理一下所使用的.sh文件内容

nvcc -c foo.cu -o foo.o
ar cr libfoo.a foo.o
nm -g --defined-only libfoo.a
gcc main.c -o main libfoo.a -lcudart -lcuda -lstdc++

第二种方式使用cuda函数

这种方法不打算使用lib来引入,直接通道.o来加载,这种形式相对简单一些,但是不怎么灵活,如果有一天我需要修改foo的文件内容,重新编译以后,还得顺带将main一块再次编译

第二种方式是普通的.c调用方式,直接放脚本好了

rm -rf *.o main
nvcc -c foo.cu -o foo.o
gcc -Wall -c main.c
gcc -o main foo.o main.o -lcudart -lcuda -lstdc++
./main

第三种方式使用cuda函数

按照ffmpeg里面使用.cu的方式,首先将.cu编译成.ptx,然后在源码中加载这个.ptx并使用里面的func,其中.ptx是与平台无关的汇编代码

下面是测试所用cubin.cu,他一共有三个函数

#include <stdio.h>
#include <cuda_runtime.h>

extern "C"   __global__  void kernel_run()
    printf("hello world!\\n");



extern "C"   __global__  void kernel_run2(void *p1, void *p2)
    printf("p1:%c====p2:%c.\\r\\n", p1, p2);


extern "C"   __global__  void kernel_add(int *sum, int *p1, int *p2)
    *sum = *p1 + *p2;

main.c则首先加载这个.ptx文件,然后load这三个函数并调用

#include <stdio.h>
#include <string.h>
#include <cuda_runtime.h>
#include <cuda.h>


int main()

    CUresult error;
    CUdevice cuDevice; 
    cuInit(0);
    int deviceCount = 0;
    error = cuDeviceGetCount(&deviceCount);
    printf("device count is %d\\n",deviceCount);
    error = cuDeviceGet(&cuDevice, 0); 

    if(error!=CUDA_SUCCESS)
        printf("Error happened in get device!\\n");
    

    CUcontext cuContext;
    error = cuCtxCreate(&cuContext, 0, cuDevice);
    if(error!=CUDA_SUCCESS)
        printf("Error happened in create context!\\n");
    

    // 使用编译出来的cubin
    CUmodule module;
    CUfunction function; // 调用kernel_run
    CUfunction function2; // 调用kernel_run2
    CUfunction function3; // 调用kernel_add

    const char* module_file = "cubin.ptx";
    const char* kernel_name = "kernel_run";
    const char* kernel_name2 = "kernel_run2";
    const char* kernel_name3 = "kernel_add";

    error = cuModuleLoad(&module, module_file);
    if(error!=CUDA_SUCCESS)
        printf("Error happened in load moudle %d!\\n",error);
    

    // 测试用kernel_run函数
    error = cuModuleGetFunction(&function, module, kernel_name);
    if(error!=CUDA_SUCCESS)
        printf("get function error!\\n");
    
    cuLaunchKernel(function, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0);
    cudaThreadSynchronize();

    // 测试用kernel_run2函数
    error = cuModuleGetFunction(&function2, module, kernel_name2);
    if(error!=CUDA_SUCCESS)
        printf("get function error!\\n");
    

    int age1 = 23;
    int age2 = 99;
    void *kernelParams[]= (void *)&age1, (void *)&age2; 
    cuLaunchKernel(function2, 1, 1, 1, 1, 1, 1, 0, 0, kernelParams, 0);
    cudaThreadSynchronize();

    // 测试用kernel_run3函数
    int *dev_a = 0;
    int *dev_b = 0;
    int *dev_c = 0;
    int cudaStatus = cudaMalloc((void**)&dev_a, sizeof(int));
    cudaStatus = cudaMalloc((void**)&dev_b, sizeof(int));
    cudaStatus = cudaMalloc((void**)&dev_c, sizeof(int));
    int h_a = 1;
    int h_b = 99;
    cudaMemcpy(dev_a, &h_a, sizeof(int), cudaMemcpyHostToDevice);
    cudaMemcpy(dev_b, &h_b, sizeof(int), cudaMemcpyHostToDevice);
    void *kernelParams3[]= &dev_c, &dev_a, &dev_b;
    error = cuModuleGetFunction(&function3, module, kernel_name3);
    if(error!=CUDA_SUCCESS)
        printf("get function error!\\n");
    
    cuLaunchKernel(function3, 1, 1, 1, 1, 1, 1, 0, 0, kernelParams3, 0);
    cudaThreadSynchronize();
    // exchange data
    int sum;
    cudaMemcpy(&sum, dev_c, sizeof(int), cudaMemcpyDeviceToHost);
    printf("------%d------\\r\\n", sum);
    cudaFree( dev_a );
    cudaFree( dev_b );
    cudaFree( dev_c );

    return 1;

执行顺序

  • 1、先用nvcc编译.cu得到.ptx
  • 2、在用gcc编译main.c得到最终的可执行程序
  • 3、执行该可执行程序

所使用到的代码如下

nvcc -ptx cubin.cu
gcc main.c -o main -lcudart -lcuda -lstdc++ && ./main

输出内容如下

device count is 1
hello world!
p1:23====p2:99.
------100------

ubuntu18.04下cuda.cu在c/c++中的三种使用方式(代码片段)

...第二种方式使用cuda函数第三种方式使用cuda函数操作系统ubuntu18.04前提想要在.c文件中使用cuda的函数,即.cu的内容安装nvcc不是这里的内容,但是确保能使用nvcc,这是保证能编译.cu的前提,查看nvcc的版本命令如下nvc... 查看详情

ubuntu18.04下cuda.cu在c/c++中的三种使用方式(代码片段)

...式使用cuda函数第三种方式使用cuda函数参考网站操作系统ubuntu18.04前提想要在.c文件中使用cuda的函数,即.cu的内容安装nvcc不是这里的内容,但是确保能使用nvcc,这是保证能编译.cu的前提,查看nvcc的版本命令如下nvc... 查看详情

webassembly技术_在web端运行c与c++程序(ubuntu18.04)(代码片段)

1.前言WebAssembly/wasmWebAssembly或者wasm是一个可移植、体积小、加载快并且兼容Web的全新格式。WebAssembly(缩写为wasm)是一种使用非JavaScript代码,并使其在浏览器中运行的方法。这些代码可以是C、C++或Rust等。它们... 查看详情

在ubuntu18.04下搭建kvm

 前一段时间一直在尝试Ubuntu上搭建xen,一直出现各种问题,各种坑首先先感谢下面这个公司对我的耐心解答,非常感谢。特别是后面来的电话对我进行了详细的解答,所以选择搭建kvm。1.需要检查一下CPU是否支持虚拟化,执... 查看详情

mariadb10在centos8和ubuntu18.04下不同(代码片段)

一个功能在本地Ubuntu18.04开发机器上可以正常插入记录(yii2),代码传到服务器(从Windows2008迁移到CentOS8)就是不行,感觉诡异,都是mariadb数据库啊在console中写了段测试,大致如下$data=[//....];$m... 查看详情

ubuntu18.04下openfoam2.3.1安装及配置

参考技术AOpenFOAM2.3.1是Ubuntu14.04下发布的,尝试N次在18.04下安装失败后,求助Bruno大神,随后Bruno在OpenFOAMwiki上放出了howtoinstallOpenFOAMinUbuntu18.04,完美安装。Sourceguide的编译出现问题,OpenFOAM2.3.1版本的SourceGuide在Ubuntu环境下用Doxygen... 查看详情

ubuntu18.04下安装中文输入法(代码片段)

阅读目录阐述第一步:首先需要给Ubuntu18.04安装Chinese语言包支持gnome界面unity界面第二步:ibus输入法安装(先Ctrl+Alt+T调出Terminal窗口)第三步在键盘输入来源(Inputsources)中添加中文拼音输入法阐述Ub... 查看详情

ubuntu18.04下配置jdk1.8

 ubuntu下配置jdk第一步与win10下相同 首先来到官网下载jdk:https://www.oracle.com/technetwork/java/javase/downloads/jdk8-downloads-2133151.html在这里下载了压缩包的版本。1.下载完成后,解压文件使用命令:tar-zxvfjdk-8u191-linux-x64.tar.gz2.解压 查看详情

ffmpeg基础linux环境下ffmpeg的配置(ubuntu18.04)(代码片段)

...程,有需要的可以直接去官网查看:CompilationGuide/Ubuntu–FFmpegsudoapt-getupdatesudoapt-get-yinstallautoconfautomakebuild-essential\\libass-devlibfreetype6-devlibsdl2-devlibtheora-dev\\libtoollibva-devlibvdpau-devlibvorbis-devlibxcb1-dev\\libxcb-shm0-devlibxcb-xfixes0-devp... 查看详情

解决ubuntu18.04系统下网易云音乐安装后无法打开问题

第一步:在终端修改sudoerssudogedit/etc/sudoer#在打开的文本编辑器中,最后添加一行(felix为我的用户名)felixALL=NOPASSWD: /usr/bin/netease-cloud-music#保存退出第二步:修改网易云音乐的启动图标sudogedit/usr/share/applications/netease-cloud-music... 查看详情

解决ubuntu18.04安装nvidia驱动开机卡死

参考技术A最近笔者在折腾Ubuntu18.04时遇到了一个小问题,笔者笔记本是双显卡的,在强迫症的驱使下,总觉得Nvidia的闭源驱动很给力,然后使用"ubuntu-driversautointall"这个命令自动安装了Nvidia显卡闭源驱动,安装一时爽,重... 查看详情

c/c++c语言的自增操作在不同编译器的差别(代码片段)

...;//(++i)*(++i)printf("%d%d\\n",j,k);执行结果在Ubuntu18.04下通过GCC编译和执行的结果:注意第一个值是12。在Windows10下通过VS2015编译和执行的结果:注意第一个值是9。也就是说同样的代码,在不同的编译器下... 查看详情

Visual Studio 2017 Intellisense 不适用于 CUDA(.cu 文件)

】VisualStudio2017Intellisense不适用于CUDA(.cu文件)【英文标题】:VisualStudio2017IntellisensenotworkingforCUDA(.cuFiles)【发布时间】:2021-06-1405:49:02【问题描述】:我无法让Intellisense处理我的任何.cu文件(CUDA文件)。我尝试了thisquestion和here... 查看详情

ubuntu18.04版本下安装ros系统

...各种网络上别人安装的方法安装,出现各种问题,在配置ubuntu安装源时出现E:Malformedentry60inlistfile/etc/apt/sources.list(Component)E:Thelistofsourcescouldnotberead.等等,都是源配置问题。下面是本人最后安装成功的步骤。Ubuntu18.04 对应的ROS... 查看详情

如何在ubuntu18.04中使用privoxy实现ubuntu终端的scientificsurftheinternet(代码片段)

总结一下如何在Ubuntu18.04中使用privoxy实现ubuntu终端的scientificsurftheInternet安装privoxysudoapt-getinstallprivoxy如果安装遇到报错E:Sub-process/usr/bin/dpkgreturnedanerrorcode(1)"的错误可以在/var/lib/dpkg目录下执行sudocpinfoinfo.ba 查看详情

编译 cuda_ndarray.cu 失败:libcublas.so.7.5:无法打开共享对象文件

】编译cuda_ndarray.cu失败:libcublas.so.7.5:无法打开共享对象文件【英文标题】:Failedtocompilecuda_ndarray.cu:libcublas.so.7.5:cannotopensharedobjectfile【发布时间】:2016-06-0719:03:34【问题描述】:我正在尝试在aws实例中导入theano库以使用GPU。我... 查看详情

在 Ubuntu 18.04 WSL 上安装无人值守的 MySQL 8 社区

】在Ubuntu18.04WSL上安装无人值守的MySQL8社区【英文标题】:UnatttendedMySQL8communityinstallonUbuntu18.04WSL【发布时间】:2019-11-1723:43:49【问题描述】:我正在尝试在没有任何提示的情况下在Ubuntu(即Linux的Windows子系统)上安装MySQL8。我有... 查看详情

ubuntu18.04/20.04下安装搜狗输入法

https://pinyin.sogou.com/linux/guide 查看详情