Suponiendo algo como:¿Hay una macro estándar para detectar arquitecturas que requieren un acceso de memoria alineado?
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];
}
}
puedo ir más rápido en una máquina de acceso no alineados (por ejemplo, 86) escribiendo algo como:
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];
}
}
Sin embargo, tiene que basarse en varias arquitecturas así que le gustaría hacer algo como:
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
}
Pero no puedo encontrar ninguna buena información sobre las macros compilador definida (como mi hipotética __ALIGNED4__
arriba) que especifican la alineación o cualquier forma inteligente de usar el pre-procesador para determinar la alineación de la arquitectura de destino. Podría simplemente probar defined (__SVR4) && defined (__sun)
, pero preferiría algo que solo funcione TM en otras arquitecturas que requieran accesos de memoria alineados.
La CPU realiza los ciclos extra para obtener los datos desalineados y cambiarlos al lugar correcto. Normalmente, esto sería mucho más lento que obtener alineado. Siempre debe tratar de leer alineado ... – DipSwitch
Solo quiero decir que siempre trabajé en sistemas que no pueden hacer copias alineadas de forma que acabo de asumir la existencia de copias normales y "rápidas" como es normal. –
Lamentablemente, esto está en una biblioteca y no puedo controlar cómo los usuarios de esta biblioteca alinean los almacenamientos intermedios que me envían. – nolandda