将设备中分配的数据从设备复制到主机

2023-12-02

我有一个在设备中动态分配的指针,那么如何将其从设备复制到主机。

#include <stdio.h>

#define cudaSafeCall(call){   \
  cudaError err = call;       \
  if(cudaSuccess != err){     \
    fprintf(stderr, "%s(%i) : %s.\n", __FILE__, __LINE__, cudaGetErrorString(err));   \
    exit(EXIT_FAILURE);       \
}}
#define cudaCheckErr(errorMessage) {    \
  cudaError_t err = cudaGetLastError(); \
  if(cudaSuccess != err){               \
    fprintf(stderr, "%s(%i) : %s : (code %d) %s.\n", __FILE__, __LINE__, errorMessage, err, cudaGetErrorString(err)); \
    exit(EXIT_FAILURE);                 \``
}}

struct num{  
int *a;
int b;
};

__device__ struct num *gun;
int main()
{
  int i;
  char c[100];
  struct num *dun,*cun; 
  cudaSafeCall(cudaSetDevice(1));
  cun=(struct num*)malloc(10*sizeof(struct num));  
  cudaSafeCall(cudaMalloc(&dun,10*sizeof(struct num)));
  cudaSafeCall(cudaMemcpyToSymbol(gun,&dun,sizeof(struct num*)));
  __global__ void kernel();
  kernel<<<1,10>>>();
  cudaSafeCall(cudaDeviceSynchronize());  
  cudaCheckErr(c);
  cudaSafeCall(cudaMemcpyFromSymbol(&dun,gun,sizeof(struct num*)));
  cudaSafeCall(cudaMemcpy(cun,dun,10*sizeof(struct num),cudaMemcpyDeviceToHost));
  for(i=0;i<10;i++) cudaSafeCall(cudaMalloc(&csu[i].a,10*sizeof(int)));  
  cudaSafeCall(cudaGetSymbolAddress((void**)csu[0].a,(void**)gun[0].a));  
  for(i=0;i<10;i++)   cun[i].a=(int*)malloc(10*sizeof(int));
  for(i=0;i<10;i++)   cudaSafeCall(cudaMemcpy(cun[i].a,dun[i].a,10*sizeof(int),cudaMemcpyDeviceToHost));
  printf("%d ",cun[8].b);
  printf("%d ",cun[8].a[8]);
  cudaSafeCall(cudaFree(dun));
  free(cun);
}

__global__ void kernel()
{
  int i;
  int tid=threadIdx.x;
  gun[tid].b=tid;
  gun[tid].a=(int*)malloc(10*sizeof(int));/*this is dynamically allocated in device.*/
  for(i=0;i<10;i++)
    gun[tid].a[i]=tid+i;
}

在这个程序中,总是会出现“分段错误”

cudaSafeCall(cudaMemcpy(cun[i].a,dun[i].a,10*sizeof(int),cudaMemcpyDeviceToHost))

为什么?我该怎么做才能将这些数据从设备复制到主机?


您遇到的问题是您试图在主机代码中使用设备指针间接,这是非法的。在你的例子中

cudaMemcpy(cun[i].a,dun[i].a,10*sizeof(int),cudaMemcpyDeviceToHost)

dun包含一个设备指针,所以dun[i].a意味着间接dun[i]读取值a。这不是有效的主机内存地址,因此会导致段错误。当您执行此操作时,您实际上已经将指针复制到内核分配的堆内存:

cudaMemcpy(cun,dun,10*sizeof(struct num),cudaMemcpyDeviceToHost);

所以按照该代码

int ** a_h = (int **)malloc(10 * sizeof(int *)); // to hold heap pointers
for(i=0;i<10;i++) {
   a_h[i] = cun[i].a; // save heap pointer
   cun[i].a=(int*)malloc(10*sizeof(int));                 
   cudaMemcpy(cun[i].a,a_h[i],10*sizeo(int),cudaMemcpyDeviceToHost); // copy heap to host
}

应该安全地将您分配的堆内存复制回主机。

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

将设备中分配的数据从设备复制到主机 的相关文章

  • 摆脱异步 cuda 流执行期间的忙等待

    我正在寻找一种方法 如何摆脱以下代码中主机线程中的忙等待 不要复制该代码 它仅显示我的问题的想法 它有许多基本错误 cudaStream t steams S N for int i 0 i lt S N i cudaStreamCreat
  • 无法排除 Gradle 复制任务的目录

    我有一个 gradle 脚本 我想将 3 个目录复制到另一个文件夹中 但我还必须排除目录 这是我开始的树结构 src gt java gt tms gt common src gt java gt tms gt dla src gt jav
  • tcmalloc/jemalloc 和内存池之间有什么区别(以及选择的理由)?

    tcmalloc jemalloc是改进的内存分配器 还引入了内存池以更好地分配内存 那么它们之间有什么区别以及在我的应用中如何选择它们呢 这取决于您的程序的要求 如果您的程序有更多的动态内存分配 那么您 需要从可用的分配器中选择一个内存分
  • Realloc 和 sscanf 到一个函数中

    我有一个文件 里面有num行 每一行包含一个数字 我想将每个数字保存到一个向量中 vet 为什么这段代码不起作用 Segmentation fault core dumped 我认为错误是sscanf in save numbers功能 但
  • 无法在 CUDA 中找到 1 到 100 数字的简单和?

    我正在研究使用 CUDA 的图像处理算法 在我的算法中 我想使用 CUDA 内核找到图像所有像素的总和 所以我在cuda中制作了内核方法 来测量16位灰度图像的所有像素的总和 但我得到了错误的答案 所以我在cuda中编写了一个简单的程序来查
  • CUDA 和 Eigen 的成员“已声明”错误

    我只是 CUDA 和 Nsight 的初学者 希望利用出色的 GPU 性能进行线性代数运算 例如 CUBLAS 我在以下人员的帮助下编写了很多自定义代码Eigen http eigen tuxfamily org index php tit
  • 跨 dll 边界的内存分配和释放

    我知道在一个 dll 中进行内存分配然后在另一个 dll 中释放内存可能会导致各种问题 尤其是与 CRT 相关的问题 当涉及到导出 STL 容器时 此类问题尤其成问题 我们之前遇到过此类问题 在编写与我们的库链接的自定义 Adob e 插件
  • 复制带有内嵌图像的表格

    我正在尝试将 GDoc 的内容复制到另一个 GDoc 中 这对于所有不同的元素类型都非常有效 包括一个表 枚举DocumentApp ElementType TABLE 但是 如果表包含内联图像 EnumDocumentApp Elemen
  • SQL Server:将数据从一列复制到另一列?

    我有两个具有相同列的表anomaly id 我想复制该行anomaly id使用此代码从第一个表到第二个表 UPDATE amb anamoly log update SET anamoly id t2 anomaly id FROM am
  • CUDA 代码会损坏 GPU 吗?

    在测试包含内存错误的 CUDA 时 我的屏幕被冻结了 重新启动后我无法再检测到显卡 我的代码是否有可能物理损坏该卡 这发生在 Ubuntu 14 04 下 我不知道该卡的型号 因为我无法检测到它 但我记得它是一张相当新的卡 感谢所有的评论我
  • CUDA 中的 JPEG 库

    我正在尝试在 CUDA 中压缩和解压缩图像 到目前为止我已经找到了这个库 http sourceforge net projects cuj2k source navbar http sourceforge net projects cuj
  • 如何从尖点库矩阵格式获取原始指针

    我需要从尖点库矩阵格式获取原始指针 例如 cusp coo matrix
  • 以编程方式在java的resources/source文件夹中创建文件?

    我有两个资源文件夹 src 这是我的 java 文件 资源 这是我的资源文件 图像 properties 组织在文件夹 包 中 有没有办法以编程方式在该资源文件夹中添加另一个 properties 文件 我尝试过这样的事情 public s
  • 使用设备函数指针数组

    我需要以下设备版本 主机代码 double func double x double func1 double x return x 1 double func2 double x return x 2 double func3 doubl
  • 大小 8 2 的读/写无效

    在处理我的学校项目时 在 Unix 学校服务器上编译我的项目后 我不断收到来自 Valgrind 的以下错误 并且无法运行该程序 因为我收到 分段错误 11 95183 Memcheck a memory error detector 95
  • realloc():重新分配为 char * 上的 strcat 腾出空间时下一个大小无效 [重复]

    这个问题在这里已经有答案了 我在以下代码中收到无效内存错误 printf s n FINE 5 printf s LENGTH IS d n FINE 6 strlen buffer char realloc buffer strlen b
  • 为什么在 CUDA 中启动 32 倍数的线程?

    我参加了 CUDA 并行编程课程 并且看到了许多 CUDA 线程配置的示例 其中通常将所需的线程数四舍五入到最接近的 32 倍数 我知道线程被分组为 warp 并且如果您启动 1000 个线程 GPU 无论如何都会将其四舍五入到 1024
  • 与 CUDA 占用计算器不同的实验结果

    我研究CUDA架构 我在如下环境中编写了一些并行处理代码 GPU GTX580 CC为2 0 每块线程 16x16 256 每线程寄存器 16 每块共享内存 48 字节 我通过编译选项知道寄存器的数量和共享内存的大小 ptxas optio
  • 我可以将 CUDA 与非 NVIDIA GPU 一起使用吗? [复制]

    这个问题在这里已经有答案了 我正在寻找一种在没有 NVIDIA GPU 的系统上运行 CUDA 程序的方法 我尝试安装 MCUDA 和 gpuOcelot 但安装似乎遇到一些问题 我已经浏览了中给出的答案如何使用软件实现在没有 GPU 的情
  • 如何在 Java 编程中使用 GPU

    我这些天都在使用 CUDAC 来访问 GPU 但现在我的导游要求我使用 Java 和 GPU 于是我在网上搜索发现Rootbeer是最好的选择 但我无法理解如何使用 Rootbeer 运行程序 可以有一个吗告诉我使用 Rootbeer 的步

随机推荐

  • 目标 c 中 didload 方法启动时的 LandscapeOrientation

    我做了一个iPad应用程序 当我第一次以纵向模式加载应用程序时 它工作正常 但是当我第一次以横向模式加载应用程序时 它仅采用纵向模式的坐标 因为在我的内部didLoad方法我只给出纵向模式的坐标 现在需要给出我的横向模式的坐标didLoad
  • Docker 无法启动 Rails

    我正在尝试使用 Rails 启动我的 Rails 应用程序 它依赖于redis 它似乎可以工作 但是当rails服务器启动时它会失败Cannot assign requested address connect 2 for 1 6379 E
  • GetFileVersionInfo() 返回错误的文件版本信息

    我有一个应用程序需要检查各种系统 EXE 和 DLL 的版本以确定它们是否容易受到攻击 这是一个本机 C 应用程序 在其清单中不提供任何特定的 WinSxS 链接 在 Windows 7 上 当我在绝对路径 例如 c windows sys
  • 编写函数将某些列更改为小写

    我正在尝试编写一个函数 该函数允许我将数据框中某些字段的大小写更改为小写 我试图通过使用 function for 和 tolower 命令来做到这一点 但我没有任何运气 我对 R 还很陌生 所以我可能会遗漏一些明显的东西 我将不胜感激任何
  • 将具有动态高度的 div 移出其父容器

    我正在尝试将高度动态变化的 div 移出其父 div 并返回 问题是动态高度 否则我可以轻松地将负高度设置为底部值 现在我只是将一个很大的负数像素设置为底部值 但这不是很好 也不能正确解决问题 从逻辑上讲 这种情况发生在少数人身上 fidd
  • 这个计算每个元音出现次数的 C 程序有什么问题?

    PROBLEM 编写一个 C 程序 提示用户输入一串以 ENTER 键结尾的字符 即 n 然后统计该字符串中每个元音出现的总数 您的程序应遵循以下准则 你的程序应该声明一个由5个整型计数器组成的数组 即counter 使用循环 您的程序应将
  • 编写一个 c 函数,在给定特定范围的情况下生成一个随机数、一对随机数或一组随机数

    我必须为 3 种不同的情况生成随机数 我 1 个骰子 二 一对骰子 三 3 个骰子 我的问题 1 请建议我为所有 3 种情况生成随机数的良好逻辑 2 当我考虑2个骰子而不是1个骰子的cses时 逻辑会改变吗 3 我们生成随机数的范围对随机函
  • 如何在社交媒体应用中阻止 Firebase 上的用户?适用于 iOS

    在此输入图像描述我的应用程序完成度约为 90 并已准备好发布它 以便可以发布它进行测试 我被苹果拒绝了 因为我没有一个非常重要的功能 一种让用户阻止滥用用户的机制 我已经有了一个可以关注其他用户的功 能 但我一直困惑于如何阻止访问 这样当一
  • 如何在ELB后面的tomcat上重定向到https

    我在 AWS 上有以下设置 ELB 终止 SSL gt nginx 在 80 上接收 http 并转发到 gt 8080 上的 tomcat 但是当我在 servlet 中执行 response sendRedirect somepath
  • 使用正则表达式从 html 中提取电子邮件

    我正在尝试使用正则表达式从中提取任何 jabber 帐户 电子邮件 这一页 我尝试过使用正则表达式 w w w w w 但它没有产生预期的结果 这可能有效 s lt gt s lt gt s lt gt p re compile ur s
  • 分解(转置?)Spark SQL 表中的多列

    我正在使用 Spark SQL 我提到它在 Spark 中 以防影响 SQL 语法 我还不够熟悉 无法确定 并且我有一个正在尝试重新构造的表 但我尝试同时转置多列时遇到困难 基本上我的数据看起来像 userId someString var
  • 如何修复 Google OAuth API - (403) 您的 API 密钥上配置了按 IP 或按引用者限制

    我最近将一个项目转移到另一台服务器 域名是一样的 只是指向了新服务器 网址完全相同 然而 自从移动项目以来 当应用程序尝试连接到 google OAuth api 时 我收到此错误 name Error calling GET https
  • CSS 自定义光标在 FF/Chrome 中不起作用

    我正在尝试使用下图创建自定义光标 http anuary com dev hp pad3 public images hand cursor png 必须保留图像大小 我试过简单地使用body cursor url http anuary
  • Ansible 列表列表 - 扁平化

    我在剧本中使用 set fact 来使用 regex findall 收集数据 我用正则表达式取出两个组 最终结果变成一个列表列表 set fact nestedList myOutput stdout 0 regex findall n
  • 找出构成四边形的点的顺序

    给予的同时一个答案 to 给定四个坐标检查它是否形成正方形 我碰到这个答案 它检查平行四边形 然后检查直角 这有效 但前提是输入的点按一定顺序排列 即 P1 和 P3 必须彼此 相对 而不是相邻 那么 问题来了 如果输入的四个点可以按任何顺
  • 位置“/”处的匹配叶路由没有元素

    位置 处的匹配叶路由没有元素 这意味着默认情况下它将呈现一个空值 从而导致 空 页面 App js File import BrowserRouter as Router Routes Route from react router dom
  • 如何使用 Silverlight 4.0 且不使用 EF 设置 RIA 服务

    作为 Silverlight 新手 我发现设置 RIA Web 服务非常困难 网络上提供的示例几乎总是将实体框架称为 ORM 但我们使用 NHibernate 作为 ORM 我知道 Brad Abrams 的教程 他使用 NHibernat
  • Django ManyToManyField 引用其他应用程序返回“app.model.None”

    我试图从另一个应用程序获取模型 ManyToManyField 并创建一个列表 但在尝试在模板中调用它时它返回 app1 Model None app1 models class Illness models Model title mod
  • 将 1000 位数字与 10 位数字交换 (C)

    我正在尝试切换 例如 输入 54321 987 然后 4 和 2 应该切换 因此输出将为 52341 987 54321 777 应变为 52341 777 如果是 2345 777 则应为 4325 777 除此之外的任何事情我都不关心
  • 将设备中分配的数据从设备复制到主机

    我有一个在设备中动态分配的指针 那么如何将其从设备复制到主机 include