如果使用cuda api从GPU Memory复制到Persistent Memory,是否需要外部调用flush?

Do I need to externally call flush if using cuda api to copy from GPU Memory to Persistent Memory?

我正在使用 Cuda API: cudaMemcpyAsync ( void* dst, const void* src, size_t count, cudaMemcpyKind kind, cudaStream_t stream = 0 )

从 CPU 内存中复制 GPU 内存中的数据。如果使用 memcpy() 将数据从 CPU 内存复制到持久内存,我们需要显式调用刷新操作(例如 clflush())以确保数据从 CPU 缓存中刷新。使用cudaMemcpyAsync()从GPU内存复制到持久内存时是否需要调用刷新操作;

Do I need to call the flush operation when copying from GPU Memory to Persistent Memory using cudaMemcpyAsync();

没有

但是,您正在调用一个潜在的异步 API,因此您可能需要使用同步 API 之一(流或设备范围)以确保操作之间的数据一致性可能会重叠并需要访问相同的内存区域。

从 Sandy Bridge 开始采用服务器非核心设计的英特尔处理器支持 Data Direct I/O (DDIO),默认情况下启用。对于 DDIO,WB 类型的入站 PCIe 写入目标系统内存位置是分配写入事务。

对于完整写入(写入整个缓存行),IIO 首先通过使一致性域中的所有副本无效(存在于同一 NUMA 节点中的 L3 中除外)来获得目标缓存行的所有权原始设备已连接。如果该行在目标 L3 中尚不存在,则会分配一个 L3 条目,这可能需要驱逐另一行才能生成 space。写入在 L3 中执行,线路的一致性状态变为 M。这意味着数据不会发送到其地址映射到的内存控制器。部分写入缓冲在 IIO(在一致性域中)中,直到它们最终被逐出写入 LLC(分配或更新)。在 DDIO 中,读取从不分配。

即使禁用DDIO,PCIe 写入也可以缓存在DDIO 中。当 cudaMemcpyAsync 甚至 cudaMemcpy returns 时,无法保证所有写入都已到达 Intel 处理器上的持久域(除非您具有全系统持久性)。此外,不能保证内存副本是持久原子的,并且不能保证字节将以什么顺序从 IIO 移动到目标内存控制器。您需要一个标志来告诉您整个数据是否已持久化。

可以使用barrier(cudaStreamSynchronize() or cudaDeviceSynchronize())在host上等待,直到数据拷贝操作完成,然后flush每个cache line,接着写一个flag,在那个顺序。