复制没有memcpy的字节
问题描述:
我有几个不同类型的变量存储在一个char数组中。复制没有memcpy的字节
int a = 5;
memcpy(offset, (char*)&a, sizeof(int))
然而,memcpy的不OpenCL内核工作:通常我会他们这样写到阵列。如果没有这个功能,最简单的方法是什么?
答
您可以轻松地够提供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个字节,则以无符号long long为单位进行复制。有时候甚至需要填充一个缓冲区来使其达到8个字节的倍数。
答
循环如何?
int a;
unsigned char * p = (unsigned char *)&a;
for (int i = 0; i != sizeof(int); ++i) offset[i] = p[i];
答
您可以使用VLOAD和VSTORE命令只是1-16个字节的字符类型和整型4-64个字节,长型8-128个字节。取决于总内核的内存访问模式,这可能是有利的或不利的。
我没有检查,但本应触发编译器使用一个CPU快SSE AVX加载和存储,并使用全总线宽度的GPU。此外,对齐条件也得到满足,因为它是使用加载存储进行未对齐访问时的高级行为。
你需要阵列的不结盟头部先复制。如果有的话。