我有幾個不同類型的變量存儲在一個char數組中。複製沒有memcpy的字節
int a = 5;
memcpy(offset, (char*)&a, sizeof(int))
然而,memcpy的不OpenCL內核工作:通常我會他們這樣寫到陣列。如果沒有這個功能,最簡單的方法是什麼?
我有幾個不同類型的變量存儲在一個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。此外,對齊條件也得到滿足,因爲它是使用加載存儲進行未對齊訪問時的高級行爲。
你需要陣列的不結盟頭部先複製。如果有的話。