CUDA 内核调用中的隐式构造函数

2023-12-08

我正在尝试将一些 POD 传递给内核,该内核具有一些非 POD 作为参数,并且具有非显式构造函数。其背后的想法是:在主机上分配一些内存,将内存传递给内核,并将内存封装在对象中,而无需用户显式执行该步骤。

构造函数被标记为 __device__ 代码,但传递参数时不会调用它们,我不明白为什么。

我的问题实际上与我应该如何做这件事无关,而是试图了解幕后发生的事情。

这是一个示例(我使用的是 CUDA 5,GPU 的性能为 2.1,因此使用 printf)。

#include <stdio.h>

struct Test {
    __device__ Test() {
        printf("Default\n"),
        _n = 0;
    }
    __device__ Test(int n) {
        printf("Construct %d\n", n);
        _n = n;
    }
    __device__ Test(const Test &t) {
        printf("Copy constr %d\n", t._n);
        _n = t._n;
    }
    __device__ Test &operator=(const Test &t) {
        printf("Assignment %d\n", t._n);
        _n = t._n;
        return *this;
    }
    __device__ int calc() const {
        printf("Calculating %d\n", threadIdx.x + 10 * _n);
        return threadIdx.x + 10 * _n;
    }
    int _n;
};

__global__ void dosome(Test a, Test b) {
    printf("Kernel data %d %d\n", a._n, b._n);
    a.calc();
    b.calc();
}

int main(int argc, char **argv) {
    dosome<<<1, 2>>>(2, 3);
    cudaError_t cudaerr = cudaDeviceSynchronize();
    if (cudaerr != cudaSuccess)
        printf("kernel launch failed with error:\n\t%s\n",cudaGetErrorString(cudaerr));
    return 0;
}

编辑:忘了说,没有打印任何构造函数消息,但打印了 calc 和内核消息。

EDIT2:是否保证 CUDA 将初始化一个测试对象before将其复制到设备上?


您必须像普通方法一样看到构造函数。如果你用它来限定它__host__,那么您就可以将其称为主机端。如果你用它来限定它__device__,您可以将其称为设备端。如果你用两者来限定它,你就可以在两边调用它。

当你这样做时会发生什么dosome<<<1, 2>>>(2, 3);是这两个对象是隐式构造的(因为你的构造函数不是explicit,所以也许这也让你感到困惑)主机端然后memcpy到设备。该过程中不涉及复制构造函数。

让我们来说明一下:

    __global__ void dosome(Test a, Test b) {
        a.calc();
        b.calc();
    }

    int main(int argc, char **argv) {
        dosome<<<1, 2>>>(2, 3); // Constructors must be at least __host__
        return 0;
    }

// Outputs:
Construct 2 (from the host side)
Construct 3 (from the host side)

现在如果你改变你的内核ints 而不是Test:

__global__ void dosome(int arga, int argb) {
    // Constructors must be at least __device__
    Test a(arga);
    Test b(argb);
    a.calc();
    b.calc();
}

int main(int argc, char **argv) {
    dosome<<<1, 2>>>(2, 3);
    return 0;
}

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

CUDA 内核调用中的隐式构造函数 的相关文章

  • UTF8/UTF16 和 Base64 在编码方面有什么区别

    In c 我们可以使用下面的类来进行编码 System Text Encoding UTF8 System Text Encoding UTF16 System Text Encoding ASCII 为什么没有System Text En
  • SSH 主机密钥指纹与模式 C# WinSCP 不匹配

    我尝试通过 WinSCP 使用 C 连接到 FTPS 服务器 但收到此错误 SSH 主机密钥指纹 与模式不匹配 经过大量研究 我相信这与密钥的长度有关 当使用 服务器和协议信息 下的界面进行连接时 我从 WinSCP 获得的密钥是xx xx
  • 写入和读取文本文件 - C# Windows 通用平台应用程序 Windows 10

    有用 但在显示任何内容之前 您必须在文本框中输入内容 我想那是因为我使用了 TextChanged 事件处理程序 如果我希望它在没有用户交互的情况下显示文本文件的内容 我应该使用哪个事件处理程序 因此 我想在按下按钮时将一些数据写入 C W
  • C# 用数组封送结构体

    假设我有一个类似于 public struct MyStruct public float a 我想用一些自定义数组大小实例化一个这样的结构 在本例中假设为 2 然后我将其封送到字节数组中 MyStruct s new MyStruct s
  • HttpClient 像浏览器一样请求

    当我通过 HttpClient 类调用网站 www livescore com 时 我总是收到错误 500 可能服务器阻止了来自 HttpClient 的请求 1 还有其他方法可以从网页获取html吗 2 如何设置标题来获取html内容 当
  • A* 之间的差异 pA = 新 A;和 A* pA = 新 A();

    在 C 中 以下两个动态对象创建之间的确切区别是什么 A pA new A A pA new A 我做了一些测试 但似乎在这两种情况下 都调用了默认构造函数 并且仅调用了它 我正在寻找性能方面的任何差异 Thanks If A是 POD 类
  • 如何在 Team Foundation 上强制发表有意义的签入评论?

    我有一个开发团队有一个坏习惯 他们写道poor签入评论 当我们必须在团队基础上查看文件的历史记录时 这使得它成为一场噩梦 我已经启用了变更集评论政策 这样他们甚至可以在签到时留下评论 否则他们不会 我们就团队的工作质量进行了一些讨论 他们很
  • 线程、进程和 Application.Exit()

    我的应用程序由主消息循环 GUI 和线程 Task Factory 组成 在线程中我调用一些第三方应用程序var p new Process 但是当我调用Application Exit 在消息循环中 我可以看到在线程中启动的进程仍在内存中
  • 初始化变量的不同方式

    在 C 中初始化变量有多种方法 int z 3 与 int 相同z 3 Is int z z 3 same as int z z 3 您可以使用 int z z 3 Or just int z 3 Or int z 3 Or int z i
  • Windows 10 中 Qt 桌面应用程序的缩放不当

    我正在为 Windows 10 编写一个简单的 Qt Widgets Gui 应用程序 我使用的是 Qt 5 6 0 beta 版本 我遇到的问题是它根本无法缩放到我的 Surfacebook 的屏幕上 这有点难以判断 因为 SO 缩放了图
  • 像“1$”这样的位置参数如何与 printf() 一起使用?

    By man I find printf d width num and printf 2 1 d width num 是等价的 但在我看来 第二种风格应该与以下相同 printf d num width 然而通过测试似乎man是对的 为什
  • 用 C 实现 Unix shell:检查文件是否可执行

    我正在努力用 C 语言实现 Unix shell 目前正在处理相对路径的问题 特别是在输入命令时 现在 我每次都必须输入可执行文件的完整路径 而我宁愿简单地输入 ls 或 cat 我已经设法获取 PATH 环境变量 我的想法是在 字符处拆分
  • C 中的位移位

    如果与有符号整数对应的位模式右移 则 1 vacant bit will be filled by the sign bit 2 vacant bit will be filled by 0 3 The outcome is impleme
  • 检查 url 是否指向文件或页面

    我们需要以下内容 如果文件确实是文件 则从 URL 下载该文件 否则 如果它是一个页面 则什么也不做 举个简单的例子 我有以下命令来下载文件 My Computer Network DownloadFile http www wired c
  • 将应用程序从 Microsoft Access 迁移到 VB 或 C#.NET

    我目前正试图说服管理层需要将我们的应用程序之一移植到 NET 该应用程序已经发展成为 Access 中的一个庞然大物 SQL 后端 拥有 700 个链接表 650 个表单 子表单 130 个模块和 850 个查询 我几乎知道这样做的所有主要
  • 已过时 - OpenCV 的错误模式

    我正在使用 OpenCV 1 进行一些图像处理 并且对 cvSetErrMode 函数 它是 CxCore 的一部分 感到困惑 OpenCV 具有三种错误模式 叶 调用错误处理程序后 程序终止 Parent 程序没有终止 但错误处理程序被调
  • ListDictionary 类是否有通用替代方案?

    我正在查看一些示例代码 其中他们使用了ListDictionary对象来存储少量数据 大约 5 10 个对象左右 但这个数字可能会随着时间的推移而改变 我使用此类的唯一问题是 与我所做的其他所有事情不同 它不是通用的 这意味着 如果我在这里
  • 在Linux中使用C/C++获取机器序列号和CPU ID

    在Linux系统中如何获取机器序列号和CPU ID 示例代码受到高度赞赏 Here http lxr linux no linux v2 6 39 arch x86 include asm processor h L173Linux 内核似
  • 如何在 C# 中播放在线资源中的 .mp3 文件?

    我的问题与此非常相似question https stackoverflow com questions 7556672 mp3 play from stream on c sharp 我有音乐网址 网址如http site com aud
  • 如何连接字符串和常量字符?

    我需要将 hello world 放入c中 我怎样才能做到这一点 string a hello const char b world const char C string a hello const char b world a b co

随机推荐

  • Angular 2 Aot 错误:致命错误:CALL_AND_RETRY_LAST 分配失败 - JavaScript 堆内存不足

    在运行 Angular 2 AOT rollup 时我遇到了上述问题 lt Last few GCs gt 144518 ms Mark sweep 1317 0 1404 4 gt 1317 0 1404 4 MB 1522 9 0 0
  • 如何让一个进程等待多个资源?

    我目前正在使用 SimPy 来建模和模拟服务器进程 我希望该进程根据从何处接收此消息来执行不同的操作 SimPy 文档展示了如何等待多个事件 例如 yield event1 事件2 不过 我目前正在尝试等待多个商店提供资源 场景如下 服务器
  • 将测试结果添加到 VSTS 中的测试运行(测试用例)

    我需要将测试结果添加到 VSTS 中的测试用例中 我是 VSTS 新手 不确定我的代码出了什么问题 var ur new Uri https myaccount visualstudio com VssCredentials cr new
  • Vaadin 7 在组件之间触发自定义事件

    我想创建自定义事件并在视图的某些部分触发它们 以便更新 删除 刷新视图的其他部分 我尝试过扩展 Component Event 和 Component Listener 但它不起作用 我认为事件和侦听器必须仅限于同一组件实例 Vaadin
  • Cython 条件编译基于通过“setuptools”给出的外部值

    我尝试从 Cython pyx 文件有条件地生成 C 代码 我在 Cython 文档中找到了我可以使用的DEF定义一个值和IF根据定义的值有条件地生成代码 但是如何从setup py via Extension from setuptool
  • 如何从离子应用程序中删除闪屏

    直接启动应用程序 不会出现闪屏和白屏 我正在开发一个离子应用程序 我需要在加载应用程序之前删除应用程序启动时显示的启动屏幕 我不想要任何闪屏 需要删除完整的闪屏不知道该怎么做 让我展示一下我的应用程序的机器设置 Your system in
  • Breeze.Server.WebAPI2“无法满足包依赖性约束”

    我正在尝试添加Breeze Server WebAPI2Nuget 包到 Visual Studio Community 2015 RC 当我单击安装时 我收到 无法满足包依赖性约束 列出的依赖项是 Microsoft AspNet Web
  • 重启Android Studio

    如何重启Android Studio来克服Gradle项目刷新失败错误 无法在以下位置找到哈希字符串 Google Inc Google APIs 23 的目标 C Users Admin AppData Local Android sdk
  • html表格的浮动水平滚动条

    我有一个非常高的 html 表格 网页必须垂直滚动才能到达表格底部的滚动条 当用户滚动页面并且表格可见时 如果我可以将表格的水平滚动条浮动在浏览器窗口底部 那就太好了 这样的事可以做吗 这是 jsFiddle 的情况示例 http jsfi
  • 缩短/避免 if 语句中级联空检查的方法

    我有这个条件 if Model Bids null Model Bids Items null Model Bids Items Count gt 0 问题是 我认为这很丑陋 我可以编写一个封装此函数的函数 但我想知道是否还有其他东西可以帮
  • 如何使用 Google Apps 脚本从 Google 电子表格单元格获取 url?

    我有一个从 Excel 复制的谷歌电子表格 我对此有一些问题 这是我的文件https docs google com spreadsheets d 1Ok phu5OXtvKHLj3MLa7N3WV2qBdMWRz8dLHnTqjHrc e
  • Crystal Reports 图像在 Web 查看器中不可见

    我在继承的应用程序 NET 1 1 中有一些 Crystal Reports V10 该应用程序部署在四个 相同 环境中 在其中三种环境中 它们运行良好 在第四种情况下 图表图形在 Web 查看器中不可见 如果导出报告 它们是可见的 IT
  • 验证日期时间选择器的输入

    如何在 XML 视图中为 datetimepicker 注册验证错误回调 以及如何因无效日期输入而触发此事件 The 日期时间选择器控件是一个带有弹出日期选择器的输入框 用户可以直接在输入中键入或使用所选日期来选择日期 我可以向日期时间值添
  • “Microsoft.ACE.OLEDB.12.0”64x Sql Server 和 86x Office?

    错误 OLE DB 提供程序 Microsoft ACE OLEDB 12 0 不能用于分布式查询 因为该提供程序配置为在单线程单元模式下运行 我看到的答案是 64 位 Sql Server 和 32 位 Office 之间存在冲突 有没有
  • 如何在android中将单个字符串转换为JsonArray?

    我需要将 String 转换为 JsonArray 但我不知道如何转换 我是 Android 开发新手 我想在 MySQL 数据库中插入通话记录详细信息 所以 从 android 端我得到一个字符串 但我不知道如何将该字符串转换为 Json
  • 如何旋转这个 openGl 代码

    在这段代码中 我尝试绘制简单的奥林匹克环并旋转它 下面的工作正常 但我无法旋转环 帮助我解决这个问题 void myReshape int width int height glViewport 0 0 width height glMat
  • 什么是抑制异常?

    一条评论 由用户soc on an answer to 关于尾调用优化的一个问题提到Java 7有一个新功能叫做 抑制异常 因为 ARM的加入 支持ARM CPU 在这种情况下 什么是 受抑制的异常 在其他情况下 抑制的异常 是捕获然后忽略
  • 致命错误:未捕获错误:调用未定义的函数 mysql_pconnect()

    我在 Codeigniter 中遇到这些错误 Fatal error Uncaught Error Call to undefined function mysql pconnect in C xampp1 htdocs CI system
  • xtsible 对象,在 quantmod 中循环

    我想循环遍历股票代码列表并使用以下命令打印它们chartSeries 这比总是改变论点要容易得多 不幸的是 当我想要循环或子集时 我总是会收到错误 Error in try xts x error chartSeries requires
  • CUDA 内核调用中的隐式构造函数

    我正在尝试将一些 POD 传递给内核 该内核具有一些非 POD 作为参数 并且具有非显式构造函数 其背后的想法是 在主机上分配一些内存 将内存传递给内核 并将内存封装在对象中 而无需用户显式执行该步骤 构造函数被标记为 device 代码