2017-03-16 53 views
2

我有幾個不同類型的變量存儲在一個char數組中。複製沒有memcpy的字節

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

然而,memcpy的不OpenCL內核工作:通常我會他們這樣寫到陣列。如果沒有這個功能,最簡單的方法是什麼?

回答

2

您可以輕鬆地夠提供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個字節的倍數。

3

循環如何?

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

您可以使用VLOAD和VSTORE命令只是1-16個字節的字符類型和整型4-64個字節,長型8-128個字節。取決於總內核的內存訪問模式,這可能是有利的或不利的。

我沒有檢查,但本應觸發編譯器使用一個CPU快SSE AVX加載和存儲,並使用全總線寬度的GPU。此外,對齊條件也得到滿足,因爲它是使用加載存儲進行未對齊訪問時的高級行爲。

你需要陣列的不結盟頭部先複製。如果有的話。