【问题标题】:OpenCL allcoation flag CL_MEM_USE_HOST_PTR usage not referencing my pointerOpenCL allcoation 标志 CL_MEM_USE_HOST_PTR 使用未引用我的指针
【发布时间】:2016-05-17 13:25:03
【问题描述】:

我试图将标志 CL_MEM_USE_HOST_PTR 与 OpenCL 函数 clCreateBuffer() 一起使用,以避免多次内存分配。经过一点研究(逆向工程),我发现无论我使用什么标志,框架都会调用操作系统分配函数。

也许我的概念是错误的?但从文档来看,它应该使用 DMA 来访问主机内存,而不是分配新内存。

我在 Intel 设备 (HD5500) 上使用 opencl 1.2

【问题讨论】:

  • 哪个实现?贝格内特?
  • 不,我在 windows 上使用 opencl 实现。

标签: opencl gpu intel


【解决方案1】:

在英特尔 GPU 上,确保分配的主机指针与页面对齐且页面长度*。实际上我认为缓冲区大小实际上可以是偶数个缓存行,但我总是四舍五入。

使用类似的东西:

void *host_ptr = _aligned_malloc(align_to(size,4096),4096));

Here's a good article for this: 在“关键要点”中。

如果您已经拥有数据并希望将数据加载到 OpenCL 中 缓冲区对象,然后使用CL_MEM_USE_HOST_PTR 分配一个缓冲区 一个 4096 字节的边界(与页面和缓存行边界对齐)和一个 总大小是 64 字节的倍数(缓存行大小)。

您也可以使用CL_MEM_ALLOC_HOST_PTR 并让驱动程序处理分配。但要获得指针,您必须对其进行映射和取消映射(但无需复制成本)。

【讨论】:

  • 这是否意味着,实现修复了开发人员忘记将其设为 64 倍数的错误?我们可以信任 AMD、NVIDIA 等其他公司吗?
  • 我想是这样,但我不确定。即使使用ALLOC_HOST_POINTER,我也会确保将长度四舍五入为 64 字节的倍数。大概可以测试一下。
  • 关于 AMD 和 NV,我不能说他们的实现。
猜你喜欢
  • 2017-05-24
  • 1970-01-01
  • 1970-01-01
  • 2011-03-23
  • 1970-01-01
  • 1970-01-01
  • 2012-11-06
  • 2014-05-06
  • 1970-01-01
相关资源
最近更新 更多