【问题标题】:Equivalent of memcpy in openclopencl 中的 memcpy 等价物
【发布时间】:2019-06-20 08:54:32
【问题描述】:

我是 opencL 的新手,这个问题可能看起来很傻。

我有一个内核,它采用两个结构 A 和 C。我想将结构 A 的内容复制到结构 C。

结构如下:

struct Block {

  bool used;
  int size;
  intptr_t data[1];

};


__kernel void function(__global struct Block *A, __global struct Block *C) {
//Do something on A
//COPY A to C by memcpy alternative
}

有没有像 memcpy 这样的函数可以在内核中使用?我在零拷贝的集成 GPU 中使用 opencl。

或者我是否必须逐块复制到结构 C?。

【问题讨论】:

  • 您确定要在内核中执行此操作吗?您可以通过clEnqueueCopyBuffer() 使用 GPU 的 DMA 引擎进行副本。
  • 如果有充分的理由在内核中执行此操作,您可能还想尝试使用async_work_group_copy() 和/或async_work_group_strided_copy() 通过global 分两个阶段复制数据 -> local -> global 内存可能比逐个复制结构更有效。我不知道在内核中使用直接的 global -> global memcpy() 类似函数。

标签: opencl


【解决方案1】:

在您的情况下,您可以简单地分配结构:

__kernel void function(__global struct Block *A, __global struct Block *C) {
  //Do something on A
  *C = *A;
}

这与普通 C 语言相同,但许多程序员不知道他们可以分配结构并求助于memcpy

【讨论】:

    猜你喜欢
    • 2010-10-05
    • 2020-09-03
    • 2020-09-08
    • 1970-01-01
    • 2012-09-11
    • 2019-11-03
    • 1970-01-01
    • 2020-10-03
    • 1970-01-01
    相关资源
    最近更新 更多