复制没有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。此外,对齐条件也得到满足,因为它是使用加载存储进行未对齐访问时的高级行为。

你需要阵列的不结盟头部先复制。如果有的话。