IT数码 购物 网址 头条 软件 日历 阅读 图书馆
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
图片批量下载器
↓批量下载图片,美女图库↓
图片自动播放器
↓图片自动播放器↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁
 
   -> Python知识库 -> CUDA thrust编译出错(认为在头文件include STL库就绝对安全?天真了) -> 正文阅读

[Python知识库]CUDA thrust编译出错(认为在头文件include STL库就绝对安全?天真了)

问题简述

? ? ? ? 对于CUDA编程,thrust库能够很方便地在Host(内存)与Device(显存)之间传输数据,在使用thrust时只用在代码中include头文件,不需要像OpenCV那样配置和链接额外的库。

? ? ? ? 但是使用thrust时需要注意这几个问题:

  1. 在c++14标准下编译:可以用使用编译指令-std=c++14,如:
    nvcc -O3 -std=c++14 -Xcompiler -fopenmp *.cpp *.cu -o output
    其中,“-O3”为最大速度编译优化,“-Xcompiler”将指令传给gcc编译器,“-fopenmp”链接openMP库,“-o output”将编译文件命名为output。ps:我个人习惯在编译共享库是才加“-fPIC”指令。如果使用cmake编译则可加入一句(set不区分大小写)
    set(CMAKE_CXX_STANDARD 14)
  2. include了thrust的文件必须用CUDA环境进行编译,例如文件后缀为.cu或通过“-x”指令指定任意后缀的文件通过CUDA环境编译。下面举一个我遇到的例子
    //---------a.h---------//
    #include <thrust/device_vector.h>
    class A
    {
    public:
        void foo();
    protected:
        thrust::device_vector<float> _temp;
    }
    //---------a.cu---------//
    #include "a.h"
    #include <stdio.h>
    void A:foo()
    {
        auto t = vector<float>(10, 0);
        _temp = t;
    }
    //---------b.cpp---------//
    #include "a.h"
    ....

    通过a.h的桥梁,b.cpp中悄悄地include了thrust,而我没使用“-x”指令,故产生错误(如下图,提示thrust库内部文件报错:/usr/local/cuda/include/thrust/detail/internal_functional.h;/usr/local/cuda/include/thrust/system/cuda/detail/par.h;/usr/local/cuda/include/thrust/system/cuda/detail/util.h等)。

    因此,千万别在头文件中include thrust!!!类的成员变量可以考虑改为静态全局变量,注意变量的初始化和实例数不能超过1。

    //---------a.h---------//
    class A
    {
    public:
        void foo();
    }
    //---------a.cu---------//
    #include "a.h"
    #include <stdio.h>
    #include <thrust/device_vector.h> // include放在cpp文件
    static thrust::device_vector<float> _temp; // 改为静态全局变量
    void A:foo()
    {
        auto t = vector<float>(10, 0);
        _temp = t;
    }
    //---------b.cpp---------//
    #include "a.h"
    ....

    即使损失一些成员变量具有的特性,但是这样能够保证安全。有更好方法的朋友欢迎评论区交流~?

  3. 有些博客说thrust是release编译得到的,用debug模式编译会出现问题,这也值得注意,不过我还没有尝试过。

  Python知识库 最新文章
Python中String模块
【Python】 14-CVS文件操作
python的panda库读写文件
使用Nordic的nrf52840实现蓝牙DFU过程
【Python学习记录】numpy数组用法整理
Python学习笔记
python字符串和列表
python如何从txt文件中解析出有效的数据
Python编程从入门到实践自学/3.1-3.2
python变量
上一篇文章      下一篇文章      查看所有文章
加:2021-09-02 11:19:16  更:2021-09-02 11:20:26 
 
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁

360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年11日历 -2024/11/15 12:58:00-

图片自动播放器
↓图片自动播放器↓
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
图片批量下载器
↓批量下载图片,美女图库↓
  网站联系: qq:121756557 email:121756557@qq.com  IT数码