不使用 memcpy 复制字节

Copying bytes without memcpy

我有几个不同类型的变量存储在一个字符数组中。通常我会这样将它们写入数组:

int a = 5;
memcpy(offset, (char*)&a, sizeof(int))

但是,memcpy 在 OpenCL 内核中不起作用。如果没有此功能,最简单的方法是什么?

循环怎么样?

int a;
unsigned char * p = (unsigned char *)&a;
for (int i = 0; i != sizeof(int); ++i) offset[i] = p[i];

你可以很容易地提供 mymemcpy

  void mymemcpy(unsigned char *dest, const unsigned char *src, size_t N)
  {
     size_t i;

     for(i=0;i<N;i++)
       dest[i] = src[i];
  }

但是它不是很有效,因为大多数副本都是 4 或 8 字节的倍数的对齐副本。如果你能计算出对齐是 8 个字节,则以 unsigned long long 为单位进行复制。有时甚至值得填充缓冲区以使其达到 8 字节的倍数。

您可以使用 vload 和 vstore 命令来处理 1-16 字节的 char 类型和 4-64 字节的 int 类型以及 8-128 字节的 long 类型。这可能是有利的,也可能是不利的,具体取决于总内核的内存访问模式。

我没有检查,但这应该会触发编译器在 cpu 上使用快速 sse avx 加载和存储,并为 gpu 使用全总线宽度。还满足对齐条件,因为它是使用加载存储进行未对齐访问的未定义行为。

您需要先复制数组的非对齐头部。如果有的话.