如何将设备函数中分配的内存复制回主内存

2023-12-02

我有一个包含主机函数和设备函数的 CUDA 程序执行()。在主机函数中,我分配了一个全局内存output然后它将被传递给设备函数并用于存储设备函数内分配的全局内存的地址。我想访问主机函数中内核分配的内存。以下是代码:

#include <stdio.h>
typedef struct                      
{
  int             * p;            
  int              num;            
} Structure_A;

__global__ void Execute(Structure_A *output);

int main(){

    Structure_A *output;
    cudaMalloc((void***)&output,sizeof(Structure_A)*1);
    dim3 dimBlockExecute(1,1);
    dim3 dimGridExecute(1,1);
    Execute<<<dimGridExecute,dimBlockExecute>>>(output);
    Structure_A * output_cpu;
    int * p_cpu;
    cudaError_t err;

    output_cpu= (Structure_A*)malloc(sizeof(Structure_A));
    err=cudaMemcpy(output_cpu,output,sizeof(Structure_A),cudaMemcpyDeviceToHost);    
    if( err != cudaSuccess)
    {
        printf("CUDA error a: %s\n", cudaGetErrorString(err));
        exit(-1);
    }
    p_cpu=(int *)malloc(sizeof(int));
    err=cudaMemcpy(p_cpu,output_cpu[0].p,sizeof(int),cudaMemcpyDeviceToHost);    
    if( err != cudaSuccess)
    {
        printf("CUDA error b: %s\n", cudaGetErrorString(err));
        exit(-1);
    }   
    printf("output=(%d,%d)\n",output_cpu[0].num,p_cpu[0]);
    return 0;
}

__global__ void Execute(Structure_A *output){

    int thid=threadIdx.x;

    output[thid].p= (int*)malloc(thid+1);

    output[thid].num=(thid+1);

    output[thid].p[0]=5;
} 

我可以编译程序。但是当我运行它时,出现错误,表明以下内存复制函数中存在无效参数:

err=cudaMemcpy(p_cpu,output_cpu[0].p,sizeof(int),cudaMemcpyDeviceToHost); 

CUDA版本是4.2。 CUDA卡:Tesla C2075 操作系统:x86_64 GNU/Linux

编辑:修改代码并为output_cpu和p_cpu分配适当大小的内存。


这段代码有很多问题。例如,您只在这两行中分配 1 个字节,不足以容纳单个实例Structure_A.

output_cpu= (Structure_A*)malloc(1);
p_cpu=(int *)malloc(1);

但错误的直接原因是您正在从设备运行时堆分配的指针(即分配malloc or new在您的设备代码中)到主机指针。

err=cudaMemcpy(p_cpu,output_cpu[0].p,sizeof(int),cudaMemcpyDeviceToHost);   

不幸的是,cudaMalloc、cudaFree 和 cudaMemcpy 的主机运行时 API 目前与设备运行时堆上分配的内存不兼容。

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

如何将设备函数中分配的内存复制回主内存 的相关文章

  • __syncthreads() 死锁

    如果只有部分线程执行 syncthreads 会导致死锁吗 我有一个这样的内核 global void Kernel int N int a if threadIdx x
  • TensorRT 多线程

    我正在尝试使用 python API 来使用 TensorRt 我试图在多个线程中使用它 其中 Cuda 上下文与所有线程一起使用 在单个线程中一切正常 我使用 docker 和 tensorrt 20 06 py3 图像 onnx 模型和
  • 有没有一种有效的方法来优化我的序列化代码?

    这个问题缺乏细节 因此 我决定创建另一个问题而不是编辑这个问题 新问题在这里 我可以并行化我的代码吗 还是不值得 https stackoverflow com questions 17937438 can i parallelize my
  • cuda中内核的并行执行

    可以说我有三个全局数组 它们已使用 cudaMemcpy 复制到 GPU 中 但 c 中的这些全局数组尚未使用 cudaHostAlloc 分配 以便分配页面锁定的内存 而不是简单的全局分配 int a 100 b 100 c 100 cu
  • 无法在内存位置找到异常源:cudaError_enum

    我正在尝试确定 Microsoft C 异常的来源 test fft exe 中 0x770ab9bc 处的第一次机会异常 Microsoft C 异常 内存位置 0x016cf234 处的 cudaError enum 我的构建环境是 I
  • CUDA 中指令重放的其他原因

    这是我从 nvprof CUDA 5 5 获得的输出 Invocations Metric Name Metric Description Min Max Avg Device Tesla K40c 0 Kernel MyKernel do
  • cudaDeviceScheduleBlockingSync 和 cudaDeviceScheduleYield 之间有什么区别?

    正如这里所说 如何减少 CUDA 同步延迟 延迟 https stackoverflow com questions 11953722 how to reduce cuda synchronize latency delay 等待设备结果有
  • CUDA Thrust 的多 GPU 使用

    我想使用我的两张显卡通过 CUDA Thrust 进行计算 我有两张显卡 在单卡上运行对于两张卡都适用 即使我在 std vector 中存储两个 device vector 也是如此 如果我同时使用两张卡 循环中的第一个周期将起作用并且不
  • 用于计算邻居列表的最佳 GPU 算法

    给定 3D 中数千个点的集合 我需要获取落在某个截止值 以欧几里得距离而言 内的每个粒子的邻居列表 并且如果可能的话 从最近到最远排序 在 CUDA 或 OpenCL 语言中 哪种 GPU 算法最快 我所知道的最快的 GPU MD 代码之一
  • C 中的 CUDA:如何使用 cudaMemcpyAsync 修复错误 11

    我目前正在尝试使用 CUDA 运行一个简单的多 GPU 程序 它的基本作用是将一个包含一些虚拟数据的大型数组复制到 GPU GPU 进行一些数学计算 然后将结果数组复制回来 我在 VS2017 的输出中没有收到任何错误 但我设置的一些错误消
  • GPU上动态分配内存

    是否可以在内核内的 GPU 全局内存上动态分配内存 我不知道我的答案有多大 因此我需要一种方法为答案的每个部分分配内存 CUDA 4 0 允许我们使用 RAM 这是一个好主意还是会降低速度 可以在内核中使用 malloc 检查以下内容 摘自
  • Cuda:最小二乘求解,速度较差

    最近 我使用Cuda编写了一个名为 正交匹配追踪 的算法 在我丑陋的 Cuda 代码中 整个迭代需要 60 秒 而 Eigen lib 只需 3 秒 在我的代码中 矩阵 A 是 640 1024 y 是 640 1 在每一步中 我从 A 中
  • 使用 Cuda 并行读取多个文本文件

    我想使用 CUDA 在多个文件中并行搜索给定字符串 我计划使用 pfac 库来搜索给定的字符串 问题是如何并行访问多个文件 示例 我们有一个包含 1000 个文件的文件夹 需要搜索 这里的问题是我应该如何访问给定文件夹中的多个文件 应该动态
  • 我们如何在每次运行时使用不同的种子在 CUDA C 中生成随机数?

    我正在研究一个随机过程 我想在每次运行程序时在 CUDA 内核中生成不同的系列随机数 这类似于我们在 C 中声明 种子 时间 空 接下来是 srand 种子 和兰特 我可以通过内核将种子从主机传递到设备 但是 这样做的问题是我必须将整个种子
  • CUDA 和 Eigen 的成员“已声明”错误

    我只是 CUDA 和 Nsight 的初学者 希望利用出色的 GPU 性能进行线性代数运算 例如 CUBLAS 我在以下人员的帮助下编写了很多自定义代码Eigen http eigen tuxfamily org index php tit
  • 如何在没有 nvcc 的情况下在编译时获取 CUDA 工具包版本?

    我在 cpp 文件中对 cuSPARSE 库进行了一些调用 这些调用在旧工具包中不可用 为了支持使用旧工具包的系统 我想使用编译器指令编译不同的代码部分 特别是 我想使用旧工具包的 CSR 格式矩阵和新工具包的 BSR 格式矩阵来求解稀疏三
  • cudaMalloc使用向量>进行管理 > C++ - NVIDIA CUDA

    我正在通过 NVIDIA GeForce GT 650M GPU 为我创建的模拟实现多线程 为了确保一切正常工作 我创建了一些辅助代码来测试一切是否正常 在某一时刻 我需要更新变量向量 它们都可以单独更新 这是它的要点 device int
  • 一维纹理内存访问比一维全局内存访问更快吗?

    我正在测量标准纹理和 1Dtexture 内存访问之间的差异 为此 我创建了两个内核 global void texture1D float doarray int size int index calculate each thread
  • CUDA cutil.h 在哪里?

    有谁知道包含 cutil h 的 SDK 工具包在哪里 我尝试了 CUDA toolkits3 2 和 toolkits5 0 我知道这个版本已经不支持 cutil h 我还注意到一些提到的如何在 Linux 中包含 cutil h htt
  • 如何转储所有 NVCC 预处理器定义?

    我想达到同样的效果 gcc dM E lt dev null 如所描述的here https stackoverflow com q 2224334 1593077 但对于 nvcc 也就是说 我想转储所有 nvcc 的预处理器定义 唉 n

随机推荐

  • ModSecurity:访问被拒绝,代码 403

    我已经为我的一台服务器启用了 mod 安全性 但是如果我提交带有 unicode 字符的表单 它会在日志中显示以下错误 并且不允许访问该网页 Wed May 192 168 0 1 2013 error client 192 168 0 1
  • 如何更新 SQL 表逻辑

    我有一个表结构为 Table 3 Fruit ID Foreign Key Primary Key of Table 1 Crate ID Foreign Key Primary Key of Table 2 现在我需要执行一个查询 Upd
  • 为什么 OpenGL 混合在 HTC Desire 上不起作用?

    有谁知道如何在 HTC Desire 上启用 OpenGL android 混合 我正在尝试绘制彩色三角形并使用颜色缓冲区的 alpha 值将它们与背景 或另一个三角形 混合 它可以在模拟器 2 1 和 htc Hero 2 1 上运行 但
  • Pygame:奇怪的位块传送错误

    我一直在使用 Python 3 1 和 PyGame 2 7 开发一个简单的主菜单 当鼠标光标位于特定区域内时 屏幕上的文本应变为白色 我正在使用函数来块传输屏幕 第一个函数通常会按块传送主菜单 而其他两个函数会按块传送菜单并突出显示一些文
  • 使用 HTTP POST 发送 > 1MB 的文件

    我正在将视频和音频文件从 Android 应用程序发送到Wampserver 其中一些可能会变得相当大 我倾向于得到OutofMemory文件即将结束时出现问题1MB在尺寸方面 我将每个文件单独转换为字节流 我认为字节流太大 因此Outof
  • SQL Server 日志文件混乱

    我正在寻找有关 SQL Server 日志文件的一些说明 我有一个较大的数据库 2GB 最近由于某种原因没有备份 数据库的日志文件增长到大约 11GB 据我了解 这是数据库中发生的所有事务和语句 我的问题 是什么原因导致数据库日志文件被刷新
  • 从笛卡尔集中选择特定集的逻辑

    我正在制作一个密码暴力破解工具作为学习练习 并且我希望它可以恢复 所以 我想要的是能够说 这是可能的字符集 如果我计算该集的每个可能组合的笛卡尔集 长度为 n 那么点 x 的集是什么 但是 我想在不计算整个集合的情况下执行此操作 我在网上的
  • sqlite全文搜索中的sql注入

    考虑 sqlite3 fts4 表 c execute CREATE VIRTUAL TABLE docs USING fts4 content 以下内容是否可以避免 txt 包含字符串的 sql 注入 我不确定参数化查询是否安全 因为只有
  • Visual Studio 部署项目可选桌面快捷方式

    您好 我正在尝试获取与 VS2010 部署项目集成的可选桌面快捷方式 我在设置的部分添加了 TargetMachine 文件系统的 用户桌面 的快捷方式 并且在用户界面中设置了一个复选框对话框 如何让 Checkbox1Property 转
  • 在每个jsp页面中包含css和js文件

    我有常见的 css 和 js 文件 它们包含在每个 jsp 文件中 那么将它们包含在每个页面中的最佳实践是什么 我以前用过但我想知道这是否是最好 最干净的继续方式 我喜欢为此使用片段 它们是 JSP 支持的标准 因此不需要其他依赖项 正如您
  • Excel 2010 VBA 单步执行字符串并按顺序将一个字符放入每个单元格中

    很多很多年前 我已经习惯在 C 中进行字符串切片 但我正在尝试使用 VBA 来完成此特定任务 现在我已经创建了一个字符串 这是一个字符串 并创建了一个新的工作簿 我现在需要的是使用字符串切片将 t 放入 A1 h 放入 A2 i 放入 A3
  • AngularDart:路由名称的命名空间也分层?

    考虑以下分层路由的初始化 摘自AngularDart 教程 router root addRoute name add path add enter view view addRecipe html addRoute name recipe
  • 如何在IntelliJ IDEA中设置SDK?

    我没有找到任何在 IntelliJ IDEA 中设置 SDK 的方法 在 ubuntu 16 04 LTS 中找不到为 IntelliJ IDEA 设置 SDK 的任何路径 我正在使用这个 IDE 来处理 mongodb 但由于这个问题无法
  • Delphi 中的库项目是否有条件定义?

    我有一个实用程序单元 其中的代码在一些应用程序和 DLL 之间共享 我想根据当前项目类型有选择地编译本单元的部分内容 应用程序 包或库 我在中找不到库或包的任何条件定义System单位 Google 没有找到任何相关内容 那么 是否有任何条
  • 删除行后释放 postgres 数据库中的存储空间的步骤?

    我超过了 Heroku 上 postgres 数据库的 GB 限制 我找到了一个 非常大的 已弃用的表并运行Plot delete all 现在 17k 行表中有 0 行 我现在可以看到行号有差异 但 GB 没有差异 这是之前的数据大小 3
  • 将 NSPredicate 应用于 [(String, Array)]

    我以这种方式存储数据 var data String Array
  • Javascript 中两个日期初始化的差异

    为什么要做这些两个日期不同 var date1 new Date date1 setFullYear 2012 year four digits date1 setMonth 10 month from 0 11 date1 setDate
  • C++ 回调将文本发送回 C#

    我是 C 新手 我被告知使用 C 的 回调 是最好的解决方案 这是我的情况 我有一个用 C 编写的 DLL这个 DLL 有一个方法来启动通过 C 代码运行的服务 这工作正常 当 DLL 中的服务运行时 我希望 DLL 将文本传递回 C 代码
  • 无法解析:com.google.firebase:firebase-analytics:9.0.0 [重复]

    这个问题在这里已经有答案了 根据Google I O 2016 我知道 Firebase 它对我来说非常好 但我无法使用它 因为这个错误 我得到了一个解决方案 将 Google play services 更新到30 但没有更新尖端 您必须
  • 如何将设备函数中分配的内存复制回主内存

    我有一个包含主机函数和设备函数的 CUDA 程序执行 在主机函数中 我分配了一个全局内存output然后它将被传递给设备函数并用于存储设备函数内分配的全局内存的地址 我想访问主机函数中内核分配的内存 以下是代码 include