首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
社区首页 >问答首页 >CUDA多设备故障,thrust::system_error

CUDA多设备故障,thrust::system_error
EN

Stack Overflow用户
提问于 2014-09-24 11:49:46
回答 1查看 195关注 0票数 0

我开发了一个使用thrust的算法。我的办公室电脑有一张带有体系结构的数据自动化系统卡:

-关于设备0的一般信息: Quadro 2000计算能力: 2.1时钟速率: 1251000 kHz设备重叠:启用内核执行超时:禁用

在这台机器上,我的算法运行时没有错误。但是,实验室机器上的一个干净的构建在试图生成一个thrust::system::system_error时抛出一个讨厌的device_vector。这两台机器都在运行RedHat 6,配置方式相同,只有多个显卡除外。这台实验室机器包含三张启用了CUDA的卡片,其结构如下:

-关于设备0名称的一般信息: Tesla C2050计算功能: 2.0时钟速率: 1147000 kHz设备重叠:启用内核执行超时:禁用 -关于设备1名称的一般信息: Quadro 2000计算能力: 2.1时钟速率: 1251000 kHz设备重叠:启用内核执行超时:禁用 -关于设备2名称的一般信息: Quadro 2000计算能力: 2.1时钟速率: 1251000 kHz设备重叠:启用内核执行超时: Enabled`

我知道,为了工作,需要针对目标体系结构编译thrust。因此,我将CUDA设备设置为1。但是,错误仍然存在。

作为调试措施,我在cudaGetDevice()分配之前放置了一个device_vector调用。该设备正确地声明为1

代码语言:javascript
运行
AI代码解释
复制
int device;
CUDA_CHECK_RETURN(cudaGetDevice(&device), __FILE__, __LINE__);
std::cout << "Operating on device " << device << std::endl; // <-- device 1

// copy the turns to the runtime
thrust::device_vector<MalfunctionTurn> d_turns = turns; // <-- error here

我想调试一下这件事就快疯了。以前有人见过这样的错误吗?更值得注意的是,cudaSetDevice()中是否存在我不知道的限制?我担心是因为两张相同的卡片在不同的机器上不能运行相同的代码。

提前谢谢。

编辑

编译命令行:nvcc -rdc=true -arch=sm_21 -O3 file

下面是一个复制错误的最小示例:

代码语言:javascript
运行
AI代码解释
复制
#define DEVICE __device__
#define HOST __host__

#include <thrust/host_vector.h>
#include <thrust/device_vector.h>

template <typename T, std::size_t N>
class Container {
public:

    DEVICE HOST
    Container() {

    }

private:
    T data[N];
};

typedef Container<double, 7> double7;

template <std::size_t N = 10 >
class History {
public:

    DEVICE HOST
    History() {

    }

    DEVICE HOST
    virtual ~History() {

    }

private:

    double7 history[N];
};

int main() {

    try {

        thrust::host_vector<History<> > histories(1);
        thrust::device_vector<History<> > d_histories = histories;
    } catch (const thrust::system_error &) {
        std::cerr << "boo boo" << std::endl;
    }

    return 0;
}
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2014-09-24 13:57:37

据我所知,您的代码(在幕后)违反了对使用虚拟函数的类的数据自动化系统限制:

不允许将具有虚拟函数的类的对象作为参数传递给__global__函数。

如果我取下你的代码并删除:

代码语言:javascript
运行
AI代码解释
复制
#include <JARSS.h>

并将其替换为:

代码语言:javascript
运行
AI代码解释
复制
#define HOST   __host__
#define DEVICE __device__

我可以编出来。然而,在引擎盖下,推力执行这一行:

代码语言:javascript
运行
AI代码解释
复制
    thrust::device_vector<History<> > d_histories = histories;

通过启动一个以要复制到设备的主机上的对象作为参数的内核。(例如,您可以使用nvprof验证内核的启动。)这是推力的常见行为。问题在于那些具有虚拟析构函数的对象不能以这种方式复制。

与您的问题所述相反,此代码不应在任何CUDA机器上正确运行。

您可以通过注释掉虚拟析构函数来“修复”您的代码。如果您需要多态行为,那么对实际代码的修复可能会比这更复杂。仍然可以使用带有推力的多态对象行为,请参阅这个答案中的工作示例。

票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/26025281

复制
相关文章
Combine 基本概念
订阅者调用request(_:_)来告知愿意接受更多的值,从一个最大的值,到无限制。
小刀c
2022/09/21
2970
Combine-Subject
Subject是一种特殊的 Publisher,最大的特点是可以手动发送数据。定义如下:
YungFan
2020/05/09
7320
聊聊 Combine 和 async/await 之间的合作
在 Xcode 13.2 中,苹果完成了 async/await 的向前部署(Back-deploying)工作,将最低的系统要求降低到了 iOS 13(macOS Catalina),这一举动鼓舞了越来越多的人开始尝试使用 async/await 进行开发。当大家在接触了异步序列(AsyncSequence)后,会发现它同 Combine 的表现有些接近,尤其结合近两年 Combine 框架几乎没有什么变化,不少人都提出了疑问:苹果是否打算使用 AsyncSequence 和 AsyncStream 替代 Combine。
东坡肘子
2022/07/28
8780
kettle实现从一个cassandra同步到另一个cassandra
1、拖拽cassandra input、cassandra output控件到工作区,如下图所示:
johnhuster的分享
2022/03/28
7370
kettle实现从一个cassandra同步到另一个cassandra
java从一个目录拷贝文件到另一个目录下
** * 复制单个文件 * @param oldPath String 原文件路径 如:c:/fqf.txt * @param newPath String 复制后路径 如:f:/fqf.txt * @return boolean */ public void copyFile(String oldPath, String newPath) { try { int bytesum = 0; int byteread = 0; File oldfile = new File(oldPath
shirayner
2018/08/10
1K0
Swift 周报 第十四期
本期是 Swift 编辑组自主整理周报的第五期,每个模块已初步成型。各位读者如果有好的提议,欢迎在文末留言。
Swift社区
2022/12/12
3.3K0
Swift 周报 第十四期
【秋招】1:机械转码(如何从一个坑,跳到另一个)
一种是直接彻底的转,如果打算直接进军互联网行业,进大厂,拿机械一辈子也可能达不到的高薪并做好了996的准备,那就直接转。
周旋
2022/09/19
1.5K0
【秋招】1:机械转码(如何从一个坑,跳到另一个)
java 把文件从一个目录复制到另一个目录
方法一:简单粗暴,直接使用copy(),如果目标存在,先使用delete()删除,再复制;
崔笑颜
2020/06/08
1.9K0
使用mysql触发器新增或修改一个表后,触发到另一个表
在工作中,有时候,我们需要备份一个表。或者是在向一张表中添加一条数据后,另一张同结构的表也要添加用于备份。如下:
凯哥Java
2019/06/28
7.4K0
使用mysql触发器新增或修改一个表后,触发到另一个表
使用VBA将图片从一个工作表移动到另一个工作表
今天跟大家分享的技巧来自thesmallman.com,一个分享Excel技巧技术的网站。
fanjy
2022/11/16
4K0
使用VBA将图片从一个工作表移动到另一个工作表
Android如何将一个项目作为library导入另一个项目
当我第一次被要求用这样的方法将一个项目当做library导入另一个项目时,其实我是拒绝的,因为,你不能让我导,我就马上导,第一我要试一下,因为我不愿意导入完成后再加上一些特技上去,代码“DUANG~~”一下,很智能,很完美,这样程序猿出来一定会骂我,根本没有这样的代码!就证明我导入的library是假的。后来我也经过证实这种导入方法是简单而实用的,我用了大概一个月左右,感觉还不错,后来我在敲代码的时候也要求他们不要加特技,因为我要让程序猿们看到,我导入后是这个样子,你们导入后也是这个样子!
代码咖啡
2018/08/28
7380
Android如何将一个项目作为library导入另一个项目
Java_io_02_从一个目录拷贝文件到另一个目录下
java从一个目录拷贝文件到另一个目录下   http://www.cnblogs.com/langtianya/p/4857524.html
shirayner
2018/08/10
4880
【区块链应用】-“区块链即服务Bass”
BaaS是一种帮助用户创建、管理和维护企业级区块链网络及应用的服务平台。它具有降低开发及使用成本,兼顾快速部署、方便易用、高安全可靠等特性,是为区块链应用开发者提供区块链服务能力的平台。BaaS通过把计算资源、通讯资源、存储资源,以及上层的区块链记账能力、区块链应用开发能力、区块链配套设施能力转化为可编程接口,让应用开发过程和应用部署过程简单而高效,同时通过标准化的能力建设,保障区块链应用的安全可靠,对区块链业务的运营提供支撑,解决弹性、安全性、性能等运营难题,让开发者专注开发。
帆说区块链
2022/04/26
12.4K0
【区块链应用】-“区块链即服务Bass”
Struts2从一个action转到另一个action的两种方法
从一个Action直接跳到另一个Action中,Struts提供了两种结果类型可以实现:chain、redirect。
ydymz
2018/09/10
7790
javaSE之如何将一个文件复制到另一个文件
1 /* 2 * (1). 文件字符输入,输出流 3 * 文件字节输入,输出流的read和write方法使用 4 * 字节数组读写数据,即以字节为单位处理数据,因此,字节流不能很好的操作Unicode字符 5 * ,比如,一个汉字在文件中占用2个字节,如果使用字节流,读取不当会出现“乱码”现象 6 * (2).字符输入流和输出流的read和write方法 7 * 使用字符数组读写数据,即以字符为基本单位处理数据 8 * 9
Gxjun
2018/03/22
1.7K0
VBA实战技巧29:从一个工作表复制数据到另一个工作表
今天演示一个简单的例子,也是经常看到网友问的问题,将一个工作表中的数据复制到另一个工作表。
fanjy
2021/07/30
25.7K1
jQuery实现从一个页面跳转到另一个页面的指定tab选项卡
最近事情比较多,小婷已经没有足够的时间去学习新的知识点,就写一写简单的东西吧,这些还是从前学习前端的时候留下的课堂的笔记,那个时候喜欢记笔记,觉得总是有用的上的地方,毕竟好记性不如烂笔头。
王小婷
2019/03/11
1.8K0
Terraform : 基础架构即代码 | 工具链
Terraform是一种开源工具,用于安全高效地预览,配置和管理云基础架构和资源。
PM吃瓜
2023/03/02
7860
Terraform : 基础架构即代码 | 工具链
点击加载更多

相似问题

将NSKeyedArchiver与Swift阵列结合使用

10

如何将MBProgressHUD与swift结合使用

100

将Laravel Passport与iOS结合使用(Swift)

12

如何将NSEventMask与Swift结合使用

11

Swift将makeConnectable与PassthroughSubject结合

220
添加站长 进交流群

领取专属 10元无门槛券

AI混元助手 在线答疑

扫码加入开发者社群
关注 腾讯云开发者公众号

洞察 腾讯核心技术

剖析业界实践案例

扫码关注腾讯云开发者公众号
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档
查看详情【社区公告】 技术创作特训营有奖征文