热门标签 | HotTags
当前位置:  开发笔记 > 开发工具 > 正文

如何将CUDA固定的“零复制”内存用于内存映射文件?

如何解决《如何将CUDA固定的“零复制”内存用于内存映射文件?》经验,为你挑选了1个好方法。

在我看来,当前cupy没有提供固定的分配器来代替普通的设备内存分配器,即可以用作固定的分配器cupy.ndarray。如果这对您很重要,那么您可以考虑提出一个冒号的问题。

但是,似乎可以创建一个。这应视为实验代码。并且有一些与其使用相关的问题。

基本思想是,我们将使用cupy.cuda.set_allocator已经建议的方式,用我们自己的来替换cupy的默认设备内存分配器。我们需要提供自己的替代品,以BaseMemory用作的存储库cupy.cuda.memory.MemoryPointer。此处的主要区别在于,我们将使用固定的内存分配器而不是设备分配器。这是PMemory以下课程的要点。

需要注意的其他事项:

在使用固定的内存(分配)完成所需的操作之后,您可能应该将cupy分配器恢复为其默认值。不幸的是,与不同cupy.cuda.set_allocator,我没有找到对应的cupy.cuda.get_allocator,这使我感到不足cupy,这似乎也值得向我提出杯状问题。但是,对于本演示,我们将仅返回到None使用默认设备内存分配器之一的选择(但是不使用池分配器)。

通过提供这种最小的固定内存分配器,我们仍然建议cupy这是普通的设备内存。这意味着不能直接从宿主代码访问它(实际上,但是cupy不知道)。因此,各种操作(例如cupy.load)将创建不需要的主机分配和不需要的复制操作。我认为解决这个问题将需要的不仅是我建议的小改变。但至少对于您的测试用例,此额外开销可能是可管理的。看来您想一次从磁盘加载数据,然后将其保留在那里。对于这种类型的活动,这应该是可管理的,尤其是因为您将其分为多个部分。就像我们将看到的那样,对于25GB的主机内存来说,处理四个5GB的块实在太多了。我们将需要为四个5GB块(实际上是固定的)分配主机内存,并且还需要一个额外的5GB“开销”缓冲区的额外空间。因此25GB不足以实现这一目标。但是出于演示目的,

与cupy的默认设备内存分配器关联的普通设备内存与特定设备有关联。固定的内存不必具有这样的关联,但是BaseMemory用类似的类对我们的琐碎替换意味着我们建议cupy该“设备”内存与所有其他普通的设备内存一样,具有特定的设备关联。在您这样的单个设备设置中,这种区别是没有意义的。但是,这不适用于固定内存的强大多设备使用。为此,再次建议cupy是通过提出问题来对进行更有效的更改。

这是一个例子:

import os
import numpy as np
import cupy



class PMemory(cupy.cuda.memory.BaseMemory):
    def __init__(self, size):
        self.size = size
        self.device_id = cupy.cuda.device.get_device_id()
        self.ptr = 0
        if size > 0:
            self.ptr = cupy.cuda.runtime.hostAlloc(size, 0)
    def __del__(self):
        if self.ptr:
            cupy.cuda.runtime.freeHost(self.ptr)

def my_pinned_allocator(bsize):
    return cupy.cuda.memory.MemoryPointer(PMemory(bsize),0)

cupy.cuda.set_allocator(my_pinned_allocator)

#Create 4 .npy files, ~4GB each
for i in range(4):
    print(i)
    numpyMemmap = np.memmap( 'reg.memmap'+str(i), dtype='float32', mode='w+', shape=( 10000000 , 100))
    np.save( 'reg.memmap'+str(i) , numpyMemmap )
    del numpyMemmap
    os.remove( 'reg.memmap'+str(i) )

# Check if they load correctly with np.load.
NPYmemmap = []
for i in range(4):
    print(i)
    NPYmemmap.append( np.load( 'reg.memmap'+str(i)+'.npy' , mmap_mode = 'r+' )  )
del NPYmemmap

# allocate pinned memory storage
CPYmemmap = []
for i in range(4):
    print(i)
    CPYmemmap.append( cupy.load( 'reg.memmap'+str(i)+'.npy' , mmap_mode = 'r+' )  )
cupy.cuda.set_allocator(None)

我没有在具有这些文件大小的25GB主机内存的安装程序中对此进行测试。但是我已经用超过我GPU的设备内存的其他文件大小对其进行了测试,并且它似乎可以工作。

同样,未经彻底测试的实验性代码可能会有所不同,因此最好通过提交大量的github问题来实现此功能。而且,正如我之前提到的,从设备代码访问这种“设备内存”通常比普通cupy设备内存要慢得多。

最后,这并不是真正的“内存映射文件”,因为所有文件内容都将被加载到主机内存中,此外,这种方法“用完”主机内存。如果要访问20GB的文件,则将需要超过20GB的主机内存。只要“加载”了这些文件,就会使用20GB的主机内存。



1> Robert Crove..:

在我看来,当前cupy没有提供固定的分配器来代替普通的设备内存分配器,即可以用作固定的分配器cupy.ndarray。如果这对您很重要,那么您可以考虑提出一个冒号的问题。

但是,似乎可以创建一个。这应视为实验代码。并且有一些与其使用相关的问题。

基本思想是,我们将使用cupy.cuda.set_allocator已经建议的方式,用我们自己的来替换cupy的默认设备内存分配器。我们需要提供自己的替代品,以BaseMemory用作的存储库cupy.cuda.memory.MemoryPointer。此处的主要区别在于,我们将使用固定的内存分配器而不是设备分配器。这是PMemory以下课程的要点。

需要注意的其他事项:

在使用固定的内存(分配)完成所需的操作之后,您可能应该将cupy分配器恢复为其默认值。不幸的是,与不同cupy.cuda.set_allocator,我没有找到对应的cupy.cuda.get_allocator,这使我感到不足cupy,这似乎也值得向我提出杯状问题。但是,对于本演示,我们将仅返回到None使用默认设备内存分配器之一的选择(但是不使用池分配器)。

通过提供这种最小的固定内存分配器,我们仍然建议cupy这是普通的设备内存。这意味着不能直接从宿主代码访问它(实际上,但是cupy不知道)。因此,各种操作(例如cupy.load)将创建不需要的主机分配和不需要的复制操作。我认为解决这个问题将需要的不仅是我建议的小改变。但至少对于您的测试用例,此额外开销可能是可管理的。看来您想一次从磁盘加载数据,然后将其保留在那里。对于这种类型的活动,这应该是可管理的,尤其是因为您将其分为多个部分。就像我们将看到的那样,对于25GB的主机内存来说,处理四个5GB的块实在太多了。我们将需要为四个5GB块(实际上是固定的)分配主机内存,并且还需要一个额外的5GB“开销”缓冲区的额外空间。因此25GB不足以实现这一目标。但是出于演示目的,

与cupy的默认设备内存分配器关联的普通设备内存与特定设备有关联。固定的内存不必具有这样的关联,但是BaseMemory用类似的类对我们的琐碎替换意味着我们建议cupy该“设备”内存与所有其他普通的设备内存一样,具有特定的设备关联。在您这样的单个设备设置中,这种区别是没有意义的。但是,这不适用于固定内存的强大多设备使用。为此,再次建议cupy是通过提出问题来对进行更有效的更改。

这是一个例子:

import os
import numpy as np
import cupy



class PMemory(cupy.cuda.memory.BaseMemory):
    def __init__(self, size):
        self.size = size
        self.device_id = cupy.cuda.device.get_device_id()
        self.ptr = 0
        if size > 0:
            self.ptr = cupy.cuda.runtime.hostAlloc(size, 0)
    def __del__(self):
        if self.ptr:
            cupy.cuda.runtime.freeHost(self.ptr)

def my_pinned_allocator(bsize):
    return cupy.cuda.memory.MemoryPointer(PMemory(bsize),0)

cupy.cuda.set_allocator(my_pinned_allocator)

#Create 4 .npy files, ~4GB each
for i in range(4):
    print(i)
    numpyMemmap = np.memmap( 'reg.memmap'+str(i), dtype='float32', mode='w+', shape=( 10000000 , 100))
    np.save( 'reg.memmap'+str(i) , numpyMemmap )
    del numpyMemmap
    os.remove( 'reg.memmap'+str(i) )

# Check if they load correctly with np.load.
NPYmemmap = []
for i in range(4):
    print(i)
    NPYmemmap.append( np.load( 'reg.memmap'+str(i)+'.npy' , mmap_mode = 'r+' )  )
del NPYmemmap

# allocate pinned memory storage
CPYmemmap = []
for i in range(4):
    print(i)
    CPYmemmap.append( cupy.load( 'reg.memmap'+str(i)+'.npy' , mmap_mode = 'r+' )  )
cupy.cuda.set_allocator(None)

我没有在具有这些文件大小的25GB主机内存的安装程序中对此进行测试。但是我已经用超过我GPU的设备内存的其他文件大小对其进行了测试,并且它似乎可以工作。

同样,未经彻底测试的实验性代码可能会有所不同,因此最好通过提交大量的github问题来实现此功能。而且,正如我之前提到的,从设备代码访问这种“设备内存”通常比普通cupy设备内存要慢得多。

最后,这并不是真正的“内存映射文件”,因为所有文件内容都将被加载到主机内存中,此外,这种方法“用完”主机内存。如果要访问20GB的文件,则将需要超过20GB的主机内存。只要“加载”了这些文件,就会使用20GB的主机内存。


推荐阅读
  • 微软头条实习生分享深度学习自学指南
    本文介绍了一位微软头条实习生自学深度学习的经验分享,包括学习资源推荐、重要基础知识的学习要点等。作者强调了学好Python和数学基础的重要性,并提供了一些建议。 ... [详细]
  • 打开文件管理器_【教程】模组管理器3.1食用指南
    文编:byakko最近有部分小伙伴反应还不会使用unity模组管理器,现在我就给大家讲一下unity模组管理器——从下载到使用。完整视频版以下是无WiF ... [详细]
  • 目录实现效果:实现环境实现方法一:基本思路主要代码JavaScript代码总结方法二主要代码总结方法三基本思路主要代码JavaScriptHTML总结实 ... [详细]
  • Android中高级面试必知必会,积累总结
    本文介绍了Android中高级面试的必知必会内容,并总结了相关经验。文章指出,如今的Android市场对开发人员的要求更高,需要更专业的人才。同时,文章还给出了针对Android岗位的职责和要求,并提供了简历突出的建议。 ... [详细]
  • Centos7.6安装Gitlab教程及注意事项
    本文介绍了在Centos7.6系统下安装Gitlab的详细教程,并提供了一些注意事项。教程包括查看系统版本、安装必要的软件包、配置防火墙等步骤。同时,还强调了使用阿里云服务器时的特殊配置需求,以及建议至少4GB的可用RAM来运行GitLab。 ... [详细]
  • [译]技术公司十年经验的职场生涯回顾
    本文是一位在技术公司工作十年的职场人士对自己职业生涯的总结回顾。她的职业规划与众不同,令人深思又有趣。其中涉及到的内容有机器学习、创新创业以及引用了女性主义者在TED演讲中的部分讲义。文章表达了对职业生涯的愿望和希望,认为人类有能力不断改善自己。 ... [详细]
  • baresip android编译、运行教程1语音通话
    本文介绍了如何在安卓平台上编译和运行baresip android,包括下载相关的sdk和ndk,修改ndk路径和输出目录,以及创建一个c++的安卓工程并将目录考到cpp下。详细步骤可参考给出的链接和文档。 ... [详细]
  • 20211101CleverTap参与度和分析工具功能平台学习/实践
    1.应用场景主要用于学习CleverTap的使用,该平台主要用于客户保留与参与平台.为客户提供价值.这里接触到的原因,是目前公司用到该平台的服务~2.学习操作 ... [详细]
  • 如何用UE4制作2D游戏文档——计算篇
    篇首语:本文由编程笔记#小编为大家整理,主要介绍了如何用UE4制作2D游戏文档——计算篇相关的知识,希望对你有一定的参考价值。 ... [详细]
  • 安卓select模态框样式改变_微软Office风格的多端(Web、安卓、iOS)组件库——Fabric UI...
    介绍FabricUI是微软开源的一套Office风格的多端组件库,共有三套针对性的组件,分别适用于web、android以及iOS,Fab ... [详细]
  • 使用在线工具jsonschema2pojo根据json生成java对象
    本文介绍了使用在线工具jsonschema2pojo根据json生成java对象的方法。通过该工具,用户只需将json字符串复制到输入框中,即可自动将其转换成java对象。该工具还能解析列表式的json数据,并将嵌套在内层的对象也解析出来。本文以请求github的api为例,展示了使用该工具的步骤和效果。 ... [详细]
  • 关于我们EMQ是一家全球领先的开源物联网基础设施软件供应商,服务新产业周期的IoT&5G、边缘计算与云计算市场,交付全球领先的开源物联网消息服务器和流处理数据 ... [详细]
  • 推荐系统遇上深度学习(十七)详解推荐系统中的常用评测指标
    原创:石晓文小小挖掘机2018-06-18笔者是一个痴迷于挖掘数据中的价值的学习人,希望在平日的工作学习中,挖掘数据的价值, ... [详细]
  • 解决Cydia数据库错误:could not open file /var/lib/dpkg/status 的方法
    本文介绍了解决iOS系统中Cydia数据库错误的方法。通过使用苹果电脑上的Impactor工具和NewTerm软件,以及ifunbox工具和终端命令,可以解决该问题。具体步骤包括下载所需工具、连接手机到电脑、安装NewTerm、下载ifunbox并注册Dropbox账号、下载并解压lib.zip文件、将lib文件夹拖入Books文件夹中,并将lib文件夹拷贝到/var/目录下。以上方法适用于已经越狱且出现Cydia数据库错误的iPhone手机。 ... [详细]
  • sklearn数据集库中的常用数据集类型介绍
    本文介绍了sklearn数据集库中常用的数据集类型,包括玩具数据集和样本生成器。其中详细介绍了波士顿房价数据集,包含了波士顿506处房屋的13种不同特征以及房屋价格,适用于回归任务。 ... [详细]
author-avatar
陈家小女u
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有