Cuda:固定内存零复制问题

2023-12-03

我尝试了这个链接中的代码CUDA 固定内存是零拷贝吗?询问者声称该程序对他来说效果很好 但在我的身上效果不一样 如果我在内核中操作它们,这些值不会改变。

基本上我的问题是,我的 GPU 内存不够,但我想做需要更多内存的计算。我的程序使用 RAM 内存或主机内存,并且能够使用 CUDA 进行计算。链接中的程序似乎解决了我的问题,但代码没有给出该人所示的输出。

关于零复制内存的任何帮助或任何工作示例都会很有用。

谢谢

__global__ void testPinnedMemory(double * mem)
{
double currentValue = mem[threadIdx.x];
printf("Thread id: %d, memory content: %f\n", threadIdx.x, currentValue);
mem[threadIdx.x] = currentValue+10;
}

void test() 
{
const size_t THREADS = 8;
double * pinnedHostPtr;
cudaHostAlloc((void **)&pinnedHostPtr, THREADS, cudaHostAllocDefault);

//set memory values
for (size_t i = 0; i < THREADS; ++i)
    pinnedHostPtr[i] = i;

//call kernel
dim3 threadsPerBlock(THREADS);
dim3 numBlocks(1);
testPinnedMemory<<< numBlocks, threadsPerBlock>>>(pinnedHostPtr);

//read output
printf("Data after kernel execution: ");
for (int i = 0; i < THREADS; ++i)
    printf("%f ", pinnedHostPtr[i]);    
printf("\n");
}

首先要分配ZeroCopy内存,你必须指定cudaHostAllocMapped标志作为参数cudaHostAlloc.

cudaHostAlloc((void **)&pinnedHostPtr, THREADS * sizeof(double), cudaHostAllocMapped);

依然是pinnedHostPointer仅用于从主机端访问映射内存。要从设备访问相同的内存,您必须像这样获取指向内存的设备端指针:

double* dPtr;
cudaHostGetDevicePointer(&dPtr, pinnedHostPtr, 0);

将此指针作为内核参数传递。

testPinnedMemory<<< numBlocks, threadsPerBlock>>>(dPtr);

此外,您必须将内核执行与主机同步才能读取更新的值。只需添加cudaDeviceSynchronize在内核调用之后。

链接问题中的代码正在运行,因为提出问题的人正在 64 位操作系统上运行代码,并且 GPU 具有计算能力 2.0 并启用了 TCC。此配置自动启用统一虚拟寻址GPU 的功能,其中设备将主机 + 设备内存视为单个大内存,而不是单独的内存,并且使用分配的主机指针cudaHostAlloc可以直接传递给内核。

对于您的情况,最终代码将如下所示:

#include <cstdio>

__global__ void testPinnedMemory(double * mem)
{
    double currentValue = mem[threadIdx.x];
    printf("Thread id: %d, memory content: %f\n", threadIdx.x, currentValue);
    mem[threadIdx.x] = currentValue+10;
}

int main() 
{
    const size_t THREADS = 8;
    double * pinnedHostPtr;
    cudaHostAlloc((void **)&pinnedHostPtr, THREADS * sizeof(double), cudaHostAllocMapped);

    //set memory values
    for (size_t i = 0; i < THREADS; ++i)
        pinnedHostPtr[i] = i;

    double* dPtr;
    cudaHostGetDevicePointer(&dPtr, pinnedHostPtr, 0);

    //call kernel
    dim3 threadsPerBlock(THREADS);
    dim3 numBlocks(1);
    testPinnedMemory<<< numBlocks, threadsPerBlock>>>(dPtr);
    cudaDeviceSynchronize();

    //read output
    printf("Data after kernel execution: ");
    for (int i = 0; i < THREADS; ++i)
        printf("%f ", pinnedHostPtr[i]);    
    printf("\n");

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

Cuda:固定内存零复制问题 的相关文章

随机推荐

  • 计算双精度数组中所有元素的总和

    我在使用数组进行递归时有点困惑 有人可以纠正我的错误吗 新更新 根据所需的问题 某些行无法编辑 double sum of array double x int size static double sum lt can be edit i
  • 如何创建多个本地通知

    我试图在我的应用程序中创建多个本地通知 但由于某种原因 只有第一个通知弹出 其余的不起作用 这是我的代码 我有一个名为克里亚警报 它负责创建通知 在该类中我有以下方法 void setarNotificacao NSInteger quan
  • 我可以通过通话事件启动我的应用程序吗?

    当用户通过 iPhone 拨打电话时 如何启动我的应用程序 为此 应用程序是否需要始终作为服务运行 或者即使它关闭 我也可以从调用中运行它吗 在 iOS 中无法启动应用程序来响应呼叫
  • 在返回向量的函数上使用 Numpy Vectorize

    numpy vectorize接受函数 f a gt b 并将其转换为 g a gt b 当a and b是标量 但我想不出为什么它不能与 b 作为标量一起使用的原因ndarray或列表 即 f a gt b 和 g a gt b 例如 i
  • CNUI 错误 设置了选择谓词,但委托未实现 contactPicker:didSelectContact:

    我尝试使用新的iOS 9 0CNContactPickerViewController在 Objective C 中选择联系人 我设置了委托并实施CNCContactPickerDelegate方法 import ContactsUI im
  • IE 11 兼容性视图

    我的网站在 IE11 中无法正常工作 我们发现它由于 XSLTProcessor 和 XPathEvaluator 而被破坏 因为 IE 不再支持它们 我做了一些研发 发现 IE9 和 IE10 也不支持它 但我的网站在 IE9 和 IE1
  • 如何在 WKWebView 中禁用 iOS 11 和 iOS 12 拖放功能?

    长按图片或链接WKWebView在 iOS 11 和 12 上启动拖放会话 用户可以拖动图像或链接 我怎样才能禁用它 我确实找到了一个涉及方法调配的解决方案但也可以在 WKWebView 中禁用拖放 而无需任何调整 注意 请参阅下面针对 i
  • Java 类链接解析步骤或初始化是否会导致加载其他解析的类?

    我正在浏览 JVM 规范文档和 JLS 了解 java 中的类加载机制 这是我的理解 首先 当主类被要求加载时 它 查看该类的二进制表示是否已经存在 是否已加载 如果没有 类加载器将从中加载类文件 磁盘 联动步骤 验证 准备和解决 初始化
  • 如何绑定CallScreeningService?

    我想获取通话详细信息并阻止通话 如果需要 由于 TelecomManager endCall 方法已被弃用 并且根据文档 建议使用 CallScreeningService https developer android com refer
  • 如何计算a^b^c mod p?

    我正在尝试计算一些正整数 a b c p 的 a b c mod p 一种可能的 也是显而易见的 方法是使用快速模幂 它将运行在O log b c clog b 虽然我不介意这里的效率 但这种方法的明显缺点是您需要一个显式的二进制表示b c
  • SSIS获取执行Sql任务结果集对象

    我有一个执行 sql 任务项 它从存储过程中获取多行数据 声明了一个变量ObjShipment在变量表下并使用以下信息将其分配到结果集下 Result Set Full result set Result Name 0 Variable N
  • ExtJS grid:在控制器中处理操作列的点击事件

    我有一个视图 EmployeeList 里面有一个网格 我需要处理来自控制器的操作列的单击事件 这是视图 Ext define ExtApp view Employees extend Ext panel Panel alias widge
  • 在 PHP 中使用表达式(连接字符串)初始化类成员变量

    我想使用表达式初始化类成员 var 通过连接字符串 为什么以下不可能 class aClass const COMPANY NAME A Company var COPYRIGHT TEXT Copyright 2011 COMPANY N
  • 有 Xamarin xaml 文件的设计器吗? [关闭]

    Closed 此问题正在寻求书籍 工具 软件库等的推荐 不满足堆栈溢出指南 目前不接受答案 我目前正在启动 Xamarin 应用程序 现在我想知道是否有任何形式的 UI 设计器 这样我就不必在设计时一遍又一遍地启动应用程序来测试 UI 可惜
  • 在 CSS 中使用多个 @font-face 规则

    我怎样才能使用超过 font face我的 CSS 规则 我已将其插入到我的样式表中 body background fff url images body bg corporate gif repeat x padding bottom
  • 在 Laravel 5.5 中处理 PostTooLargeException

    我正在尝试处理PostTooLargeException在我的 Laravel 5 5 应用程序中 当我尝试通过表单上传太大的文件时 我收到PostTooLargeException我成功地抓住了app Exceptions Handler
  • 检查对象是否是构造函数 - IsConstructor

    我想检查 JavaScript 值是否是构造函数 即它是否具有 Construct 内部方法 ECMAScript 定义是构造函数 它正是这样做的 但这是一个内部操作 所以我想效仿一下 我考虑过尝试在一个实例化或子类化try声明 但两者都不
  • 实体框架:路径中存在非法字符。 (连接字符串)(MVC3)

    我就是无法解决这个问题 我正在尝试在我的 MVC3 项目中使用实体框架 但每次我打电话Entities context new Entities 我收到此错误 路径中存在非法字符 我确实知道这与我的连接字符串有关 如下所示 metadata
  • 将图像发布到 asp.net API 2 和 Angular 2

    i get 415 不支持的媒体类型 当我尝试将图像发布到 ASP Net API 2 时 此资源不支持请求实体的媒体类型 multipart form data exceptionMessage 没有 MediaTypeFormatter
  • Cuda:固定内存零复制问题

    我尝试了这个链接中的代码CUDA 固定内存是零拷贝吗 询问者声称该程序对他来说效果很好 但在我的身上效果不一样 如果我在内核中操作它们 这些值不会改变 基本上我的问题是 我的 GPU 内存不够 但我想做需要更多内存的计算 我的程序使用 RA