问题标签 [mapped-memory]

For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.

0 投票
1 回答
472 浏览

memory - cudaHostAllocMapped 的一致性规则

有谁知道有关分配给内存区域的内存一致性模型保证的文档cudaHostAlloc(..., cudaHostAllocMapped)?例如,当来自设备的写入对来自主机的读取变得可见时(可能是在内核完成之后,在内核执行期间的最早可能时间等)。

0 投票
1 回答
283 浏览

c++ - 与 cudaHostGetDevicePointer() 有相反的含义吗?

假设我的设备是 Kepler 及更高版本,CUDA 为 6.5 或更高版本,而我的驱动程序最早是 2015 年的。

有可能做相反的事情cudaHostGetDevicePointer()吗?即,提供一些映射内存的设备端表现的地址,获取主机地址?

0 投票
1 回答
1608 浏览

cuda - GPU 内存超额使用映射内存、统一虚拟寻址和统一内存

我正在考虑在 GPU 上处理数据的可能性,这对于 GPU 内存来说太大了,我有几个问题。

如果我理解正确,使用映射内存,数据驻留在主内存中,并且仅在访问时才传输到 GPU,因此分配超过 GPU 内存的内存应该不是问题。

UVA 类似于映射内存,但数据既可以存储在 CPU 内存中,也可以存储在 GPU 内存中。但是 GPU 是否有可能在充满自己的数据的同时访问主内存(与映射内存一样)?在这种情况下会发生内存溢出吗?我已经读过,使用映射内存,数据直接进入本地内存,而不是先传输到全局内存,在这种情况下不应该有任何溢出。这是真的吗?如果是的话,UVA 也是这样吗?

在 CUDA 6.0 中,UM 不允许超额订阅 GPU 内存(并且通常不允许分配比 GPU 更多的内存,即使在主内存中也是如此),但在 CUDA 8.0 中,它成为可能(https://devblogs .nvidia.com/parallelforall/beyond-gpu-memory-limits-unified-memory-pascal/)。我做对了吗?

0 投票
0 回答
192 浏览

arrays - vb 内存映射文件整数数组

我正在尝试将整数数组创建到内存映射文件中并在 C++ 中读取该文件,但我不会在这里询问 c++ 部分。MakeMem() 有 {"缓冲区中没有足够的可用空间。"}

首先在VB中测试,从内存中读取数组

0 投票
3 回答
1514 浏览

c++ - 如何在 C++ 中正确访问映射内存而没有未定义的行为

我一直在试图弄清楚如何在不调用未定义行为的情况下从 C++17 访问映射缓冲区。对于此示例,我将使用 Vulkan 返回的缓冲区vkMapMemory

因此,根据N4659(最终的 C++17 工作草案),第[intro.object]部分(强调添加):

C++ 程序中的构造创建、销毁、引用、访问和操作对象。 当隐式更改联合的活动成员(12.3) 或创建临时对象时(7.4, 15.2) ,通过定义(6.1)、 新表达式(8.3.4) 创建对象。

显然,这些是创建 C++ 对象的唯一有效方法。因此,假设我们得到一个void*指向主机可见(和一致)设备内存的映射区域的指针(当然,假设所有必需的参数都有有效值并且调用成功,并且返回的内存块足够大正确对齐):

现在,我希望以float数组的形式访问此内存。显而易见的事情是static_cast指向指针并继续我的快乐方式,如下所示:

volatile包括在内,因为它被映射为连贯内存,因此可以在任何时候由 GPU 写入)。但是,从技术上讲float,该内存位置中不存在数组,至少在引用摘录的意义上不存在,因此通过这样的指针访问内存将是未定义的行为。因此,根据我的理解,我有两个选择:

1.memcpy数据

应该始终可以使用本地缓冲区,将其std::byte*强制memcpy转换映射区域。GPU 将按照着色器中的指示解释它(在这种情况下,作为 32 位数组float),从而解决问题。但是,这需要额外的内存和额外的副本,所以我宁愿避免这种情况。

2.放置-new数组

似乎[new.delete.placement]部分没有对如何获得放置地址施加任何限制(无论实现的指针安全性如何,它都不必是安全派生的指针)。因此,应该可以通过放置创建一个有效的浮点数组new,如下所示:

现在应该可以安全地访问指针float_array(在数组的范围内,或过去一次)。


所以,我的问题如下:

  1. 简单的static_cast确实是未定义的行为吗?
  2. 这种展示位置new的使用是否定义明确?
  3. 这种技术是否适用于类似情况,例如访问内存映射硬件

作为旁注,我从来没有通过简单地转换返回的指针而遇到问题,我只是想根据标准的字母找出正确的方法是什么。

0 投票
1 回答
61 浏览

c++ - 无法从地址打开映射文件

我无法打开映射内存。当我使用 OpenFileMappingA() 它返回 NULL 并且 GetLastError() 返回 161 (ERROR_BAD_PATHNAME)。我使用以下代码:

0 投票
1 回答
69 浏览

cuda - cudaMemset 是否应该在从 cudaHostRegister 映射的设备指针上工作

我从我的一位同事那里看到了示例代码,其中 cudaMemset 在 V100 上运行时似乎无法正常工作。

编译并运行此示例时,输出如下所示。

我们期望 A_h 和 A_d 使用 cudaMemset 设置为 1。但正如所见,它被设置为一些巨大的价值。因此,cudaMemset 是否有望在 cudaHostGetDevicePointer 返回的设备指针 A_d 上工作。这个 A_d 是否预计仅在内核中使用。我们还看到 cudaMemcpy DtoH 或 HtoD 似乎在同一个设备指针 A_d 上工作。有人可以帮助我们正确的行为。