我在主机上有一个向量,我想把它减半并发送到设备。进行基准测试表明CL_MEM_ALLOC_HOST_PTR
比CL_MEM_USE_HOST_PTR
快,比CL_MEM_COPY_HOST_PTR
快得多。此外,设备上的内存分析不会显示设备上创建的缓冲区大小有任何差异。这与Khronos- clCreateBuffer上提到的标志的文档不同。有谁知道发生了什么事?
答案 0 :(得分:8)
Pompei 2的回答是不正确的。规范不保证分配内存的位置,而只分配它的分配方式。 CL_MEM_ALLOC_HOST_PTR使clCreateBuffer为您分配主机端内存。然后,您可以使用clEnqueueMapBuffer将其映射到主机指针。 CL_MEM_USE_HOST_PTR将使运行时将您提供的数据挖掘到OpenCL缓冲区中。
通过使用CL_MEM_ALLOC_HOST_PTR实现固定内存:运行时能够尽可能地分配内存。
所有这些性能都取决于实现。更仔细地阅读3.1.1部分将显示在其中一个调用中(没有CL_MEM标志)NVIDIA能够预分配设备端缓冲区,而其他调用只是将固定数据映射到主机指针,准备写入设备
答案 1 :(得分:2)
首先,如果我理解正确,clCreateSubBuffer可能不是你想要的,因为它从现有的OpenCL 缓冲区对象创建一个子缓冲区。您链接的文档还告诉我们:
CL_MEM_USE_HOST_PTR,CL_MEM_ALLOC_HOST_PTR和CL_MEM_COPY_HOST_PTR值不能在flags中指定,但是从与缓冲区关联的相应内存访问限定符继承。
你说你在主机上有一个向量,并希望将其中的一半发送到设备。为此,我将在设备上使用一半矢量大小(以字节为单位)的常规缓冲区。
然后,使用常规缓冲区,您可以看到预期的性能。
CL_MEM_ALLOC_HOST_PTR
只在主机上分配内存,根本不会发生任何转移:这就像做一个malloc而不是填充内存。CL_MEM_COPY_HOST_PTR
将在设备上分配一个缓冲区,很可能是GPU上的RAM,然后将整个主机缓冲区复制到设备内存中。CL_MEM_USE_HOST_PTR
最有可能分配所谓的页锁定或固定内存。这种内存对于主机 - > GPU内存传输速度最快,这是进行复制的推荐方法。要了解如何在NVidia设备上正确使用固定内存,请参阅NVidia's OpenCL best practices guide的第3.1.1节。请注意,如果使用太多固定内存,性能可能会低于主机复制的内存。
原因为什么固定内存比复制的设备内存更快,在this SO question以及它指向的this forum thread中都有详细说明。
答案 2 :(得分:1)
Pompei2,你说CL_MEM_ALLOC_HOST_PTR和CL_MEM_USE_HOST_PTR在设备上分配内存,而OpenCL 1.1规范说用CL_MEM_ALLOC_HOST_PTR或CL_MEM_USE_HOST_PTR指定的内存将被分配(在第一种情况下)on或将从(在第二个)主机内存中使用?我在OpenCL中很新,但想知道哪里是真的吗?)