不使用 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 使用全总线宽度。还满足对齐条件,因为它是使用加载存储进行未对齐访问的未定义行为。
您需要先复制数组的非对齐头部。如果有的话.
我有几个不同类型的变量存储在一个字符数组中。通常我会这样将它们写入数组:
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 使用全总线宽度。还满足对齐条件,因为它是使用加载存储进行未对齐访问的未定义行为。
您需要先复制数组的非对齐头部。如果有的话.