Zakładając coś takiego:Czy istnieje standardowe makro do wykrywania architektur wymagających wyrównanego dostępu do pamięci?
void mask_bytes(unsigned char* dest, unsigned char* src, unsigned char* mask, unsigned int len)
{
unsigned int i;
for(i=0; i<len; i++)
{
dest[i] = src[i] & mask[i];
}
}
mogę jechać szybciej na maszynie niezaangażowanych dostępu (np x86) pisząc coś takiego:
void mask_bytes(unsigned char* dest, unsigned char* src, unsigned char* mask, unsigned int len)
{
unsigned int i;
unsigned int wordlen = len >> 2;
for(i=0; i<wordlen; i++)
{
((uint32_t*)dest)[i] = ((uint32_t*)src)[i] & ((uint32_t*)mask)[i]; // this raises SIGBUS on SPARC and other archs that require aligned access.
}
for(i=wordlen<<2; i<len; i++){
dest[i] = src[i] & mask[i];
}
}
Jednak to musi opierać się na kilku architektur więc chciałbym zrobić coś takiego:
void mask_bytes(unsigned char* dest, unsigned char* src, unsigned char* mask, unsigned int len)
{
unsigned int i;
unsigned int wordlen = len >> 2;
#if defined(__ALIGNED2__) || defined(__ALIGNED4__) || defined(__ALIGNED8__)
// go slow
for(i=0; i<len; i++)
{
dest[i] = src[i] & mask[i];
}
#else
// go fast
for(i=0; i<wordlen; i++)
{
// the following line will raise SIGBUS on SPARC and other archs that require aligned access.
((uint32_t*)dest)[i] = ((uint32_t*)src)[i] & ((uint32_t*)mask)[i];
}
for(i=wordlen<<2; i<len; i++){
dest[i] = src[i] & mask[i];
}
#endif
}
Ale nie mogę znaleźć żadnych informacji na temat dobrych kompilatorów zdefiniowane makra (jak moja hipotetyczna __ALIGNED4__
powyżej), które określają wyrównanie lub jakikolwiek sprytny sposób użycia pre-procesora do określenia wyrównania architektury docelowej. Mogę po prostu przetestować defined (__SVR4) && defined (__sun)
, ale wolałbym coś, co będzie po prostu działać TM na innych architekturach wymagających wyrównanych dostępów do pamięci.
Procesor wykonuje dodatkowe cykle, aby uzyskać niezaanalizowane dane i przesunąć je we właściwe miejsce. Zwykle byłoby to znacznie wolniejsze, a następnie wyrównane. Zawsze powinieneś próbować czytać wyrównane ... – DipSwitch
Powiem tylko, że zawsze pracowałem nad systemami, które nie są w stanie wykonać kopie w wyrównaniu, tak, że przyjąłem normalne normalne i "szybkie" kopie. –
Niestety jest to w bibliotece i nie mogę kontrolować, w jaki sposób użytkownicy tej biblioteki wyrównują bufory, które mi wysyłają. – nolandda