ben tutorial tanıdığımız ile hafızada bir hizalanmamış konuma bir vektör saklamak için nasıl olduğunu unaligned yükleme ve gibi bakabilirsiniz depolanması: Korkunç görünüyorAltiVec
//Load a vector from an unaligned location in memory
__vector unsigned char LoadUnaligned(const unsigned char * src)
{
__vector unsigned char permuteVector = vec_lvsl(0, src);
__vector unsigned char low = vec_ld(0, src);
__vector unsigned char high = vec_ld(16, src);
return vec_perm(low, high, permuteVector);
}
//Store a vector to an unaligned location in memory
void StoreUnaligned(__vector unsigned char v, __vector unsigned char * dst)
{
//Load the surrounding area
__vector unsigned char low = vec_ld(0, dst);
__vector unsigned char high = vec_ld(16, dst);
//Prepare the constants that we need
__vector unsigned char permuteVector = vec_lvsr(0, (int*) dst);
__vector signed char oxFF = vec_splat_s8(-1);
__vector signed char ox00 = vec_splat_s8(0);
//Make a mask for which parts of the vectors to swap out
__vector unsigned char mask = vec_perm(ox00, oxFF, permuteVector);
//Right rotate our input data
v = vec_perm(v, v, permuteVector);
//Insert our data into the low and high vectors
low = vec_sel(v, low, mask);
high = vec_sel(high, v, mask);
//Store the two aligned result vectors
vec_st(low, 0, dst);
vec_st(high, 16, dst);
}
. Bir vektörü saklamak için çok fazla iş var! Ve uygun performans kaybı vardır.
void SomeFuncA(const unsigned char * src, size_t size, unsigned char * dst)
{
for(size_t i = 0; i < size; i += 16)
{
__vector unsigned char a = vec_ld(0, src + i);
//simple work
vec_st(a, 0, dst + i);
}
}
void SomeFuncU(const unsigned char * src, size_t size, unsigned char * dst)
{
for(size_t i = 0; i < size; i += 16)
{
__vector unsigned char a = LoadUnaligned(src + i);
//simple work
StoreUnaligned(dst + i, a);
}
}
İkinci işlev, ilkinden 3-4 kez yavaşça çalışır. Giriş ve çıkış belleğinin hizalamasını kontrol edemediğimden, her iki sürümü de uygulamak zorundayım. Hizalanmamış durumdaki performans kaybını nasıl en aza indirebilirim?
Teşekkür ederiz! Harika görünüyor! – Georg