OpenCL中CL_MEM_USE_HOST_PTR和CL_MEM_COPY_HOST_PTR的基准

OpenCL中CL_MEM_USE_HOST_PTR和CL_MEM_COPY_HOST_PTR的基准,opencl,Opencl,主机上有一个向量,我想将它减半并发送到设备。做一个基准测试表明CL\u MEM\u ALLOC\u HOST\u PTR比CL\u MEM\u USE\u HOST\u PTR快,比CL\u MEM\u COPY\u HOST\u PTR快得多。此外,设备上的内存分析并没有显示设备上创建的缓冲区大小的任何差异。这与上提到的标志的文档不同。有人知道发生了什么吗?首先,如果我理解正确,clCreateSubBuffer可能不是您想要的,因为它从现有的OpenCL buffer对象创建了一个子缓冲区。

主机上有一个向量,我想将它减半并发送到设备。做一个基准测试表明
CL\u MEM\u ALLOC\u HOST\u PTR
CL\u MEM\u USE\u HOST\u PTR
快,比
CL\u MEM\u COPY\u HOST\u PTR
快得多。此外,设备上的内存分析并没有显示设备上创建的缓冲区大小的任何差异。这与上提到的标志的文档不同。有人知道发生了什么吗?

首先,如果我理解正确,clCreateSubBuffer可能不是您想要的,因为它从现有的OpenCL buffer对象创建了一个子缓冲区。您链接的文档还告诉我们:

CL_MEM_USE_HOST_PTR、CL_MEM_ALLOC_HOST_PTR和CL_MEM_COPY_HOST_PTR值不能在标志中指定,而是从与缓冲区关联的相应内存访问限定符继承

你说你在主机上有一个向量,想把它的一半发送到设备上。为此,我将在设备上使用向量大小(字节)一半的常规缓冲区

然后,使用常规缓冲区,您看到的性能是预期的

  • CL_MEM_ALLOC_HOST_PTR
    只在主机上分配内存,根本不会引起任何传输:这就像执行malloc而不填充内存一样
  • CL_MEM_COPY_HOST_PTR
    将在设备上分配一个缓冲区,很可能是GPU上的RAM,然后将整个主机缓冲区复制到设备内存中
  • 在GPU上,
    CL\u MEM\u USE\u HOST\u PTR
    最有可能分配所谓的页锁定或固定内存。这种内存对于主机->GPU内存传输是最快的,这是推荐的拷贝方式
  • 要了解如何在NVidia设备上正确使用固定内存,请参阅的第3.1.1章。请注意,如果使用过多的固定内存,性能可能会低于主机复制的内存


    固定内存比复制的设备内存快的原因在中有很好的解释,并且指出。

    庞培2,您说CL_MEM_ALLOC_HOST_PTR和CL_MEM_USE_HOST_PTR在设备上分配内存,而OpenCL 1.1规范说,使用CL_MEM_ALLOC_HOST_PTR或CL_MEM_USE_HOST_PTR将分配指定的内存(在第一种情况下)在(第二种)主机内存上或将从(第二种)主机内存中使用?OpenCL中的Im newble,但想知道哪里是真的吗?

    庞培2的答案不正确。该规范不保证内存分配在哪里,只保证如何分配。CL_MEM_ALLOC_HOST_PTR使clCreateBuffer为您分配主机端内存。然后,可以使用ClenqueueEmapBuffer将其映射到主机指针。CL_MEM_USE_HOST_PTR将导致运行时将您提供的数据收集到OpenCL缓冲区中

    固定内存是通过使用CL_MEM_ALLOC_HOST_PTR实现的:运行时能够尽可能分配内存


    所有这些性能都取决于实现。更仔细地阅读第3.1.1节将显示,在其中一个调用(无CL_MEM标志)中,NVIDIA能够预先分配设备端缓冲区,而其他调用仅将固定数据映射到主机指针,以便写入设备。

    您好,您是否使用gpu、cpu或apu设备来运行内核?还有,哪个供应商?您的系统是否有多个处理器(NUMA体系结构?)COPY_HOST_PTR执行隐式复制,但ALLOC_HOST_PTR需要显式复制。当您运行ALLOC_HOST_PTR的基准测试时,您确定要包括将缓冲区从主机复制到设备的额外步骤吗?如果不是的话,这也许可以解释为什么它要快得多。我使用NVIDIA gpu作为设备。我不同意你的观点(1)
    CL_MEM_ALLOC_HOST_PTR——此标志指定应用程序希望OpenCL实现从主机可访问内存分配内存。
    使用CL_MEM_ALLOC not use获得固定内存抱歉,我很难解析您的问题。在任何情况下,如果规范与我相矛盾,我是错的,规范是对的。