cuda与Eigen不兼容的解决方案

2023-10-26

cuda提供强大的矩阵计算库cuBlas,但cuBlas没法进行特征值、逆矩阵等高级的运算,要解决这个问题,要么自己写算法(太难),要么调用线性代数运算库,而线性代数运算库中Eigen是最简便易用的一个。

当我想把这两个库放在一起编译的时候,出现了严重问题:用VS编译无法通过!!!

用google查了一下,似乎不少人都遇到过这个问题,对于linux系统,这个问题是可以解决的,gcc4.7 以上是可以解决这个问题的(参看http://eigen.tuxfamily.org/dox-devel/TopicCUDA.html,需翻墙)


但对于windows的vs,这个问题暂时无解。

后来看有人提出一个解决思路,就是把Host部分的代码和Device部分的代码分开编译。原因是:eigen库的语法过于复杂,以至于cuda的编译器无法解析。分开编译的话,两部分代码使用不同的编译器,就解决了这个问题,然后封装一些接口,解决两个部分相互调用的问题。但文中只是提供了一个思路,没有讲具体实现方法。(参看http://stackoverflow.com/questions/21216359/member-has-already-been-declared-error-with-cuda-and-eigen)

我马上学习了编译多个源文件的知识,进行尝试,终于解决cuda与Eigen不兼容的问题。

我的解决思路是这样的:

把程序的主体部分(包括Eigen)都放在.cpp下。

把cuda需要用到的代码放在.cu下。

在vs中,project->add new item ,将上面那个.cpp文件添加进去

在.cpp文件和.cu中都声明一个命名空间 cuda_functions,将接口函数的声明放进去,然后这些函数在.cu文件中实现,例如:

<cuda_functions.h>

namespace cuda_functions{
void malloc(void ** p, size_t size);//cudaMalloc的接口函数
void free(void * p);//cudaFree的接口函数

};


<test.cu>

#include <cuda_runtime.h>
#include "cublas_v2.h"

#include "cuda_functions.h"

void cuda_functions::malloc(void ** p,size_t s){//实现接口函数cudaMalloc
cudaMalloc(p,s);
};


void cuda_functions::free(void * p){//实现接口函数cudaFree
cudaFree(p);
};

<test.cpp>

#include <iostream>
#include <Eigen/Dense>
using namespace Eigen;
using namespace std;
#include "cuda_functions.h"

void main(){

float * p;

 cuda_functions::malloc((void **)& p,sizeof(float)*10000);

 cuda_functions::free((void *) p);

while(1);

}


上面这段代码实现在.cpp文件中,开辟和释放显存空间。


本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

cuda与Eigen不兼容的解决方案 的相关文章

  • UI设计都有哪些设计原则,分享三个给你

    是什么使一个好UI设计容易阅读 是什么让用户轻松浏览 设计师如何创造一个闪亮的UI 任何软件产品的关键部分都是用户界面 好的UI设计 用户甚至会忽略它 如果做得不好 就会成为用户使用产品的绊脚石 为了更有效地设计能够满足用户使用的设计UI
  • 【原理篇】再次带你进入多线程的世界

    1 Java内存模型基础知识 1 1并发编程模型的两个关键问题 线程间如何通信 即 线程之间以何种机制来交换信息 线程间如何同步 即 线程以何种机制来控制不同线程间操作发 的相对顺序 有两种并发模型可以解决这两个问题 消息传递并发模型 共享
  • scala的基础语法之变量

    1 类介绍 我们在new scala类的时候 这里分为Class和Object两大类 idea2019 1版本 其他新版本应该是四种 case Class和case Object 不过没关系 这里想要使用case的直接在前面写case即可
  • 任正非谈成功秘诀:28年只对准一个城墙口冲锋

    文 记者 赵东辉 李斌 刘诗平 蔡国兆 彭勇 何雨欣 任正非和华为公司 堪称当代商业史上的传奇 1987年 年满43岁的任正非和5个同伴集资2 1万元成立华为公司 利用两台万用表加一台示波器 在深圳的一个 烂棚棚 里起家创业 28年后 华为
  • 穿越火线排位赛显示该服务器,CF新段位S7枪王排位调整 排位分数和地图

    CF新段位S7枪王排位调整 排位分数和地图 本次体验服客户端正式更新同时S7枪王排位赛页开启了 本期枪王排位针对地图 段位分数和奖励上进行调整 不同段位分数和地图加成都不同 枪王排位第五赛季开始及优化丢掉大脑再丢烦恼 冲啥大冲啥小 冲啥都有
  • 【无标题】PAT作业1001 害死人不偿命的(3n+1)猜想

    题目要求简要概述 输入一个小于1000的正整数 如果该正整数为奇数 进行2 n的运算 如果为偶数 进行 3n 1 2的运算 反复进行计算 直至n 1后 输出运算的次数 解题方法 1 定义两个整形变量 分别用于输入n 记录运算次数 int n
  • 将压缩包里的图片显示到页面上示例

    在做项目的时候有个这样的需求 需要把压缩包里的图片预览显示出来 梳理一下就以下三步 下载压缩包 解压出文件 组成可用的图片URL 显示到图片标签上 实现这个功能过程还是走了些弯路的 也遇到一些坑 这里就不多废话了 直接上代码 希望能帮助各位
  • SVPWM所需要掌握的一些定理

    1 正弦定理 2 伏秒平衡 不懂 伏秒平衡 又称伏秒平衡 是指开关电源稳定工作状态下 加在电感两端的电压乘以导通时间等于关断时刻电感两端电压乘以关断时间 或指在稳态工作的开关电源中电感两端的正伏秒值等于负伏秒值 在SVPWM中 磁链等于电压
  • ORB-SLAM2第二节---双目地图初始化

    比起单目初始化 而双目实现地图的初始化非常简单 只需要一帧 左右目图像 即可完成初始化 行特征点统计 考虑用图像金字塔尺度作为偏移量 在当前点上下正负偏移量 r 内的纵坐标值都认为是匹配点可能存在的行数 之所以这样做 是因为极线矫正后仍然存
  • 创建steam账户反复人机验证_您必须先通过人机验证才能创建steam帐户怎么办

    展开全部 在注册steam帐户遇到提示必须通过人机验证才能创建62616964757a686964616fe4b893e5b19e31333433643062提示时 勾选注册页面中的进行人机验证 在人机身份验证界面中点击需要的图片并按照步骤
  • socket接收报错

    首先是没得到正确错误号 是因为windows平台WSAGetLastError得过之后就没了 所以需要int变量保存一下 发现错误号后知道是最后一个参数没有初始化复制 bzero buf sizeof buf bzero cli adr s
  • PostgreSQL 多表关联删除

    用PostgreSQL数据库删除某个表数据 student 需要关联多个表 如classroom 作为条件 以下语句走不通 delete s from student s classroom c where s cid c id and s
  • JPA基本数据类型映射

    Employ author Administrator Entity Table name T EMPLOY SequenceGenerator name SEQ sequenceName SEQ SYS FUNC MENU initial
  • 利用MATLAB编写一段表格数据处理并作图

    使用MATLAB处理表格数据并作图可以使用以下步骤 读入表格数据 使用readtable或者xlsread函数读入Excel或者其他格式的表格数据 数据预处理 使用MATLAB的数组运算和统计函数对读入的数据进行预处理 包括清洗缺失值 去除
  • hadoopRPC的使用

    1模拟namenode的查询元数据 public interface ClientNamenodeProtocol public static final long versionID 1L 会读取这个版本号 但可以和客户端的不一样 没有校
  • 【数据结构】树(五)—— 二叉排序树(C语言版)

    数据结构 二叉排序树 C语言版 前言 一 二叉排序树的定义 二 二叉排序树的性质 三 二叉排序树的操作 1 二叉排序树常用存储结构 2 二叉排序树的查找 递归实现 查找 二叉树T 中键值为 key 的节点 非递归实现 查找 二叉树T 中键值
  • java中sum是什么_Java中的IntStream sum()方法

    sum Java中使用IntStream类的方法返回此流中元素的总和 语法如下 int sum 要使用Java中的IntStream类 请导入以下包 import java util stream IntStream 创建IntStream
  • 不知道华为手机识别图片文字怎么弄?2个识别方法收好了

    我们有时候会将书籍上的内容拍照下来进行抄写 但是面对大段的文字 手动抄写会比较花费时间 其实我们可以进行手机识别图片文字 一键进行文字内容提取 这样就方便多了 那你们知道华为手机识别图片文字怎么弄吗 下面我就来分享两个手机识别的方法给大家
  • python安装pip

    pip python2 安装 wget https bootstrap pypa io 2 6 get pip py python2 get pip py pip V pip3 python3 安装 wget https bootstrap
  • 攻防世界PWN新手练习区——cgpwn2

    攻防世界PWN新手练习区 cgpwn2 首先检查文件的有哪些保护 checksec cgpwn2 32位程序 用IDA反编译文件 main函数中只有hello函数 点击查看 整个函数看起来是在进行某种算法 但关键点在于return gets

随机推荐

  • 计算机的起源与发展(概述+习题)

    概述 计算机 computer 也称为 电脑 是一种具有计算功能 记忆功能和逻辑判断功能的机器设备 它能接收数据 保存数据 按照预定的程序对数据进行处理 并提供和保存处理结果 计算机的起源 图灵机 图灵机是一种抽象的计算模型 并没有真正地生
  • H3CNE综合实验

    H3CNE综合实验 实验拓扑 实验需求 按照图示配置IP地址 SW1和SW2之间的直连链路配置链路聚合 公司内部业务网段为Vlan10和Vlan20 Vlan10是市场部 Vlan20是技术部 要求对Vlan 进行命名以便识别 PC1属于V
  • python实现星空效果

    以前用DEV C 这个编译器时 看过easyx 这个C 图形库 文档中有范例程序 是模拟星空的 觉得的不错 今天有空 把Crossin用python写的一个雪花模拟程序 修改了一下 效果和easyx的基本一模一样 使用easyx的 代码 编
  • GMT、UTC与24时区 等时间概念

    许多人都知道两地时间表简称为GMT或UTC 而世界时区表则通称为World Time 那么GMT与UTC的实质原意又是为何 世界时区又是怎么区分的 面盘上密密麻麻的英文单字代表着什么意义与作用呢 这些都是新手在接触两地时间表或世界时区表时
  • java 实现删除单链表中所有指定的结点以及如何清空单链表

    文章目录 1 删除单链表中的所有的指定结点 1 1 删除思路 1 2 删除步骤 1 2 1 删除结点不是头结点 1 2 2 删除的结点是头结点的情况 1 3 部分代码思路分析 1 4 整体代码演示 2 清空单链表 1 删除单链表中的所有的指
  • 第九章 接口(上)

    第九章 接口 上 接口和内部类为我们提供了一种将接口与实现分离的更加结构化的方法 9 1 抽象类和抽象方法 包含抽象方法的类叫做抽象类 如果一个类包含一个或多个抽象方法 该类必须被限定为抽象的 否则 编译器就会报错 抽象类和抽象方法都用ab
  • 计算机组成原理:奇偶校验和汉明码校验

    目录 一 奇偶校验 奇偶校验的规律及原理 二 汉明校验码 1 校验位位置 2 汉明码的位号实质上是参与校验的各校验位位号之和 3 计算校验位的值 4 校验 设置指错字 一 奇偶校验 了解汉明码校验之前需要知道奇偶校验 奇偶校验码是一种最简单
  • JS翻转数组

    js翻转数组 reverse 方法翻转 反向添加数组 数组首尾交换 unshift 向数组头部添加 考点 在 数组首尾交换 reverse 方法肯定不是 reverse 是js方法 反向添加数组 和 unshift 向数组头部添加元素 创建
  • Java多线程学习(吐血超详细总结)

    写在前面的话 此文只能说是java多线程的一个入门 其实Java里头线程完全可以写一本书了 但是如果最基本的你都学掌握好 又怎么能更上一个台阶呢 如果你觉得此文很简单 那推荐你看看Java并发包的的线程池 Java并发编程与技术内幕 线程池
  • 基于springboot、uniapp的智慧物联网系统

    一 项目简介 基于springboot uniapp的智慧物联网系统 二 实现功能 支持二开智能家居系统 支持智慧办公系统 支持智慧社区系统 支持农业监测系统 支持水利监测系统 支持工业控制系统 三 技术选型 springboot unia
  • c++11并发与多线程-王健伟-专题视频课程

    c 11并发与多线程 364人已学习 课程介绍 本课程 讲解的重点定位在c 11新标准中的多线程开发部分 同时 老师还会结合自己的经验把多线程的讲解进一步拓展到一个比较大的范畴 因为无论是c 11多线程开发还是各种其他的多线程开发实现方法
  • Kali Linux入门教程(非常详细)从零基础入门到精通,看完这一篇就够了。

    作为一名从事渗透测试的人员 不懂Kali Linux的话 就out了 它预装了数百种享誉盛名的渗透工具 使你可以更轻松地测试 破解以及进行与数字取证相关的任何其他工作 今天给大家分享一套Kali Linux资料合集 包括12份Kali Li
  • FreeAnchor: Learning to Match Anchors for Visual Object Detection阅读

    摘要 现在基于CNN的算法都是使用IOU对目标分配Anchor 我们提出一种方法打破了IOU的限制 允许自由的分配Anchor 我们的方法 称为自由锚 FreeAnchor 将手工锚分配升级为 自由 锚匹配 FreeAnchor的目标是学习
  • JavaWeb之前后端分离的三步骤

    文章目录 一 Ajax 异步JavaScript和XML 1 1 Ajax 发送请求的步骤 1 2 如果是POST请求 则还需要设置请求头 二 JSON的使用 2 1 概念 2 2 格式 2 3 JSON 和 JS 转换 2 4 JSON
  • 返回值优化

    返回值优化 在以下几种情况中 编译器可能会省略对象的拷贝和移动操作 对象直接在原本拷贝 移动的内存中直接构造对象 当发生这种优化时 虽然拷贝 移动构造函数没有调用 但是拷贝 移动构造函数必须是可访问的 否则程序是错误的 在return语句中
  • python+Excel系列:数据导入和整理模块—pandas

    文章目录 数据导入和整理模块 pandas 一 初识pandas模块 二 二维数据表格DataFrame的创建与索引的修改 1 DataFrame的创建 1 通过列表创建DataFrame 2 通过字典创建DataFrame 3 通过二维数
  • Python requests请求方法封装

    一种对requests各种请求方法的封装 提高使用效率 特别注意的是data格式 具体业务具体分析 有的是json格式 直接上代码吧 usr bin env python coding utf 8 Author Jianhua Wang S
  • IDEA常用的配置

    1 主题风格 有些小伙伴不太喜欢黑色主题 此时可以设置IDEA的主题风格 Settings gt Editor gt Color Scheme 2 设置字体 假如一个方法有50 60行 字体设置过大 要看完整个方法 需要滚动多次滑轮 由于字
  • JVM底层又是如何实现synchronized的

    目前在Java中存在两种锁机制 synchronized和Lock Lock接口及其实现类是JDK5增加的内容 其作者是大名鼎鼎的并发专家Doug Lea 本文并不比较synchronized与Lock孰优孰劣 只是介绍二者的实现原理 数据
  • cuda与Eigen不兼容的解决方案

    cuda提供强大的矩阵计算库cuBlas 但cuBlas没法进行特征值 逆矩阵等高级的运算 要解决这个问题 要么自己写算法 太难 要么调用线性代数运算库 而线性代数运算库中Eigen是最简便易用的一个 当我想把这两个库放在一起编译的时候 出