参见英文答案 > Copying a struct containing pointers to CUDA device3个
使用CUDA编程我在尝试将一些数据从主机复制到gpu时遇到了问题.

我有3个这样的嵌套结构:

typedef struct {
    char data[128];
    short length;
} Cell;

typedef struct {
    Cell* elements;
    int height;
    int width;
} Matrix;

typedef struct {
    Matrix* tables;
    int count;
} Container;

所以Container“包含”一些Matrix元素,而这些元素又包含一些Cell元素.

假设我以这种方式动态分配主机内存:

Container c;
c.tables = malloc(20 * sizeof(Matrix));

for(int i = 0;i<20;i++){
    Matrix m;
    m.elements = malloc(100 * sizeof(Cell));
    c.tables[i] = m;
}

也就是说,每个100个单元的20个矩阵的容器.

>我现在如何使用cudamemcpy()将此数据复制到设备内存?
>有没有什么好方法可以从主机到设备执行“struct of struct”的深层复制?

谢谢你的时间.

安德里亚

解决方法

简短的回答是“只是不要”.我说这有四个原因:

> API中没有深层复制功能
>您必须编写的结果代码设置并将您描述的结构复制到GPU将是非常复杂的(至少4000个API调用,并且可能是20 Matrix of 100 Cells示例的中间内核)
>使用三级指针间接的GPU代码将大大增加内存访问延迟,并将破坏GPU上可用的小缓存一致性
>如果您想在之后将数据复制回主机,则反向遇到同样的问题

请考虑使用线性内存和索引.它可以在主机和GPU之间移植,并且分配和复制开销约为基于指针的替代方案的1%.

如果你真的想这样做,请留下评论,我会尝试挖掘一些旧的代码示例,这些示例显示了GPU上完整的愚蠢嵌套指针.

c – 如何使用CUDA执行struct的深度复制?的更多相关文章

  1. swift之附属脚本

    例如,Swift的字典实现了通过附属脚本来对其实例中存放的值进行存取操作。为了方便进行断言,Matrix包含了一个名为indexIsValid的成员方法,用来确认入参的row或column值是否会造成数组越界:断言在附属脚本越界时触发:

  2. [翻译]Swift编程语言——下标

    不会给threeTimesTable[someIndex]赋予一个新值,所以TimesTable的这个下标是一个只读下标。举例来说,Swift的字典类型实现了一个下标来实现对字典类型实例中的值的读取和赋值。Matrix实例的grid数组是一个平的矩阵,读取它要从左上到右下:传递行和列的值给下标,可以对矩阵中的值进行设置:这两句调用了下标的setter给矩阵右上角的位置设置了值1.5,给左下角的位置设置了值3.2:Matrix下标的getter和setter都含有一个检查下标的row和column是否合法的

  3. Swift学习笔记(十)附属脚本

    下面代码演示了一个在TimesTable结构体中使用只读附属脚本的用法,该结构体用来展示传入整数的n倍。Swift的字典实现了通过附属脚本来对其实例中存放的值进行存取操作。一个类或结构体可以根据自身需要提供多个附属脚本实现,在定义附属脚本时通过入参个类型进行区分,使用附属脚本时会自动匹配合适的附属脚本实现运行,这就是附属脚本的重载。如下例定义了一个Matrix结构体,将呈现一个Double类型的二维矩阵。

  4. swift详解之八---------------下标脚本

    一个类或者结构体中可以有多个下标脚本可以根据传入的参数类型进行区分Matrix提供了一个两个入参的构造方法,入参分别是rows和columns,创建了一个足够容纳rows*columns个数的Double类型数组。在阅读顺序从左上到右下的Matrix实例中的数组实例grid是矩阵二维数组的扁平化存储:示意图grid=[0.0,0.0,0.0]col0col1row0[0.0,row10.0,0.0]将值赋给带有row和column下标脚本的matrix实例表达式可以完成赋值操作,下标脚本入参使用逗号分割m

  5. Swift2.1-下标脚本

    不像实例方法,下标脚本只能是读写或者只读的。下标脚本用法“下标脚本”确切的意思取决于它使用的上下文。例如,Swift的字典类型实现了通过下标脚本来对其实例中存放的值进行存取操作。字典实例创建完成之后通过下标脚本的方式将整型值2赋值到字典实例的索引为bird的位置中。更多关于字典下标脚本的信息请参考读取和修改字典。下标脚本选项下标脚本允许任意数量的输入形参索引,并且这些输入形参可以是任何类型。

  6. Swift附属脚本

    附属脚本用法根据使用场景不同附属脚本也具有不同的含义。附属脚本选项附属脚本允许任意数量的入参索引,并且每个入参类型也没有限制。为了方便进行断言,Matrix包含了一个名为indexIsValid的成员方法,用来确认入参的row或column值是否会造成数组越界:断言在附属脚本越界时触发:

  7. Swift学习:2.12 下标脚本

    例如,Swift的字典实现了通过下标脚本来对其实例中存放的值进行存取操作。为了方便进行断言,Matrix包含了一个名为indexIsValid的成员方法,用来确认入参的row或column值是否会造成数组越界:断言在下标脚本越界时触发:

  8. Android – 拖动和裁剪问题

    注意:图像显示位于活动顶部的图像(蓝色)我想强调一点,我不希望使用任何第三方库来实现这一目标.如果需要,我非常愿意提供额外的代码.更新:完整的onTouch方法:解决方法要计算Activity的根高,我们可以使用或者您可以使用显示指标或者添加全局布局侦听器});

  9. android – 如何动画矩阵以“裁剪”图像?

    我正在尝试做一个图像查看器,当用户点击图像时,图像被“裁剪掉”并显示完整的图像.例如,在下面的屏幕截图中,用户最初只能看到小狗的一部分.但是在用户点击图像后,整个小狗都被揭露了.在第一个后面褪色的图像显示了动画的结果.最初,ImageView在X和Y中缩放到50%.当用户点击图像时,ImageView将缩放回100%,并重新计算ImageView矩阵.我尝试了各种方法来计算矩阵.但我似乎无法找到适

  10. 如何在Android中围绕图像中心旋转位图而不会发生振荡运动

    我想根据用户点击10度旋转位图图像.在众多stackoverflow和谷歌答案之后,我尝试了各种Matrix旋转组合.然而,图像并没有像预期的那样真正旋转,并且给出了关于画布中心的旋转振动的抖动视图.为了测试,每次调用对象的绘制方法时,我都会将旋转角度增加10度(而不是点击次数).图像是一个对称的圆圈[64×64包围矩形]我希望它在屏幕中心围绕它自己的中心像一个轮子一样旋转,但它会旋转并沿着对角线

随机推荐

  1. 从C到C#的zlib(如何将byte []转换为流并将流转换为byte [])

    我的任务是使用zlib解压缩数据包(已接收),然后使用算法从数据中生成图片好消息是我在C中有代码,但任务是在C#中完成C我正在尝试使用zlib.NET,但所有演示都有该代码进行解压缩(C#)我的问题:我不想在解压缩后保存文件,因为我必须使用C代码中显示的算法.如何将byte[]数组转换为类似于C#zlib代码中的流来解压缩数据然后如何将流转换回字节数组?

  2. 为什么C标准使用不确定的变量未定义?

    垃圾价值存储在哪里,为什么目的?解决方法由于效率原因,C选择不将变量初始化为某些自动值.为了初始化这些数据,必须添加指令.以下是一个例子:产生:虽然这段代码:产生:你可以看到,一个完整的额外的指令用来移动1到x.这对于嵌入式系统来说至关重要.

  3. 如何使用命名管道从c调用WCF方法?

    更新:通过协议here,我无法弄清楚未知的信封记录.我在网上找不到任何例子.原版的:我有以下WCF服务我输出添加5行,所以我知道服务器是否处理了请求与否.我有一个.NET客户端,我曾经测试这一切,一切正常工作预期.现在我想为这个做一个非托管的C客户端.我想出了如何得到管道的名称,并写信给它.我从here下载了协议我可以写信给管道,但我看不懂.每当我尝试读取它,我得到一个ERROR_broKEN_P

  4. “这”是否保证指向C中的对象的开始?

    我想使用fwrite将一个对象写入顺序文件.班级就像当我将一个对象写入文件时.我正在游荡,我可以使用fwrite(this,sizeof(int),2,fo)写入前两个整数.问题是:这是否保证指向对象数据的开始,即使对象的最开始可能存在虚拟表.所以上面的操作是安全的.解决方法这提供了对象的地址,这不一定是第一个成员的地址.唯一的例外是所谓的标准布局类型.从C11标准:(9.2/20)Apointe

  5. c – 编译单元之间共享的全局const对象

    当我声明并初始化一个const对象时.两个cpp文件包含此标头.和当我构建解决方案时,没有链接错误,你会得到什么如果g_Const是一个非const基本类型!PrintInUnit1()和PrintInUnit2()表明在两个编译单元中有两个独立的“g_Const”具有不同的地址,为什么?

  6. 什么是C名称查找在这里? (&amp;GCC对吗?)

    为什么在第三个变体找到func,但是在实例化的时候,原始变体中不合格查找找不到func?解决方法一般规则是,任何不在模板定义上下文中的内容只能通过ADL来获取.换句话说,正常的不合格查找仅在模板定义上下文中执行.因为在定义中间语句时没有声明func,并且func不在与ns::type相关联的命名空间中,所以代码形式不正确.

  7. c – 在输出参数中使用auto

    有没有办法在这种情况下使用auto关键字:当然,不可能知道什么类型的.因此,解决方案应该是以某种方式将它们合并为一个句子.这可用吗?解决方法看起来您希望默认初始化给定函数期望作为参数的类型的对象.您无法使用auto执行此操作,但您可以编写一个特征来提取函数所需的类型,然后使用它来声明您的变量:然后你就像这样使用它:当然,只要你重载函数,这一切都会失败.

  8. 在C中说“推动一切浮动”的确定性方式

    鉴于我更喜欢将程序中的数字保留为int或任何内容,那么使用这些数字的浮点数等效的任意算术最方便的方法是什么?说,我有我想写通过将转换放在解析的运算符树叶中,无需将表达式转化为混乱是否可以使用C风格的宏?应该用新的类和重载操作符完成吗?解决方法这是一个非常复杂的表达.更好地给它一个名字:现在当您使用整数参数调用它时,由于参数的类型为double,因此使用常规的算术转换将参数转换为double用C11lambda……

  9. objective-c – 如何获取未知大小的NSArray的第一个X元素?

    在objectiveC中,我有一个NSArray,我们称之为NSArray*largeArray,我想要获得一个新的NSArray*smallArray,只有第一个x对象…

  10. c – Setprecision是混乱

    我只是想问一下setprecision,因为我有点困惑.这里是代码:其中x=以下:方程的左边是x的值.1.105=1.10应为1.111.115=1.11应为1.121.125=1.12应为1.131.135=1.14是正确的1.145=1.15也正确但如果x是:2.115=2.12是正确的2.125=2.12应为2.13所以为什么在一定的价值是正确的,但有时是错误的?请启发我谢谢解决方法没有理由期望使用浮点系统可以正确地表示您的帖子中的任何常量.因此,一旦将它们存储在一个双变量中,那么你所拥有的确切的一

返回
顶部