【问题标题】:Do I need provide Gpu context when creating unified memory?创建统一内存时是否需要提供 Gpu 上下文?
【发布时间】:2017-10-26 04:18:01
【问题描述】:

问题 1)

当我调用 CUDA 驱动 API 时,通常我需要先将上下文(代表 GPU 运行时)推送到当前线程。对于普通的cuMalloc,内存将分配在上下文指定的那个 GPU 上。但是如果我尝试调用cuMallocManaged 来创建统一内存,是否还需要推送 GPU 上下文?

问题 2)

假设我有 2 个 GPU,每个都有 1 GB DRAM。那么我可以分配2 GB的统一内存吗?每个 GPU 占一半?

【问题讨论】:

    标签: cuda unified-memory cuda-context


    【解决方案1】:
    1. 遵循已建立的驱动程序 API 编程方法。显式建立 CUDA 上下文。

    2. 不,这不是托管内存的工作方式。托管分配对系统中的所有 GPU 都是可见的。无论我们谈论的是前帕斯卡 UM 机制还是纯帕斯卡 UM 机制,这都是正确的,尽管可见性的具体方法有所不同。请参阅UM with multi-GPU 上的编程指南部分。

    【讨论】:

    • 在你指出的url中,它说:对于pre-sm60设备,当前活动设备是物理分配的家,sm> = 6.0也是如此吗?这意味着,一次分配只能在一个 GPU 中完成,但可以从其他 GPU 访问。那么如果我有 2 个 GPU,每个有 1 GB,我可以分配的统一内存的最大大小是 1 GB,而不是 2 GB。
    • 该链接表示,对于 cc 6.0 及更高版本,分配将根据需要迁移到相关 GPU。 UM 分配对系统中的每个 GPU可见(即映射到),并且将按需迁移到任何 GPU,即当该 GPU 生成页面时该项目的故障,或者当该项目被明确移动时,例如通过cudaMemPrefetchAsync 命令。
    • 谢谢,我看了文档,所以对于sm60及以上,系统处理物理内存所在的位置。但是,如果我打电话给cudaMallocManaged,我为什么还要先推送一个上下文呢?或者我可以使用任何上下文?我问是因为上下文是在一个 GPU 上创建的,对于两个 gpu,你将有 2 个上下文,那么我应该使用哪一个来进行统一的内存分配?
    猜你喜欢
    • 1970-01-01
    • 2019-04-26
    • 1970-01-01
    • 1970-01-01
    • 2022-09-23
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-05-11
    相关资源
    最近更新 更多