2

首先,我很难弄清楚当通过 CL_MEM_ALLOC_HOST_PTR 时 clCreateBuffer() 是如何工作的。它是在设备上创建缓冲区并为主机分配内存,还是仅在主机上分配内存并在使用时将其缓存在设备上?

我的问题是这样的:如果我有相当多的对象具有 float* 字段的总空间比我的设备上可用的空间多,那么有没有更好的方法然后告诉运行时将主机指针(或使用它)复制到 OpenCL设备?是否可以让运行时创建主机指针并将其用于所有 float*,即使它们的总内存比设备的内存还要多?我不介意告诉它使用主机指针,但是如果我想在运行时在 CPU 上时避免内存复制,我将不得不对齐所有内存。

此外,任何关于在主机上使用比设备上可用内存更多的内存以使内存传输最有效并进行最少复制的好方法的任何提示。

谢谢。

4

1 回答 1

3

该标准仅规定:

此标志指定应用程序希望 OpenCL 实现从主机可访问内存中分配内存。

因此,它在幕后的工作方式取决于实现。NVIDIA 在其OpenCL Programming Guide (V4.2)的第 3.3.1 节中声明:

使用 CL_MEM_ALLOC_HOST_PTR 标志 (...) 的对象可能会被驱动程序分配在页面锁定内存中以获得最佳性能。

AMD在他们自己的指南(此处)中,在第 4.5.2 节中给出了一个表格,显示每个标志值的内存对象的位置。整个 4.5 节专门讨论 OCL 内存对象。你可能会觉得很有趣。

关于您的问题,如果您没有足够的内存空间,则没有其他解决方案(至少我能想到),只能按照此处的建议拆分数据并分多次处理。

于 2013-06-12T09:35:38.523 回答