El vector extensions de GCC ofrece una forma agradable y razonablemente portátil de acceder a algunas instrucciones SIMD en diferentes arquitecturas de hardware sin recurrir a hardware specific intrinsics (o auto-vectorización).Cargando datos para las extensiones vectoriales de GCC
Un caso de uso real, es el cálculo de una suma de comprobación aditiva simple. Lo único que no está claro es cómo cargar datos de forma segura en un vector.
typedef char v16qi __attribute__ ((vector_size(16)));
static uint8_t checksum(uint8_t *buf, size_t size)
{
assert(size%16 == 0);
uint8_t sum = 0;
vec16qi vec = {0};
for (size_t i=0; i<(size/16); i++)
{
// XXX: Yuck! Is there a better way?
vec += *((v16qi*) buf+i*16);
}
// Sum up the vector
sum = vec[0] + vec[1] + vec[2] + vec[3] + vec[4] + vec[5] + vec[6] + vec[7] + vec[8] + vec[9] + vec[10] + vec[11] + vec[12] + vec[13] + vec[14] + vec[15];
return sum;
}
Al lanzar un puntero al tipo de vector parece funcionar, pero me preocupa que esto podría explotar de una manera horrible si el hardware SIMD espera que los tipos de vectores para estar alineados correctamente.
La única otra opción que he pensado es utilizar un vector temporal y cargar explícitamente los valores (mediante una asignación memcpy o element-wise), pero al probar esto se contrarrestan la mayor parte de la aceleración del uso de las instrucciones SIMD. Idealmente, me imagino que esto sería algo así como una función genérica __builtin_load()
, pero ninguna parece existir.
¿Cuál es una forma más segura de cargar datos en un vector arriesgando problemas de alineación?
La ejecución de este en la memoria no alineada en x86_64 GCC causará una SIGSEGV cuando la CPU intenta cargar la memoria desalineada en un registro SSE. Una opción razonable parece ser solo la memoria de suma de comprobación o utilizar un ciclo normal para sumar los bytes hasta el primer límite de 16 bytes. – dcoles
En su código actual, la carga de los datos se compila muy bien si el compilador conoce la entrada (pero la suma es mala): https://godbolt.org/g/DeR3Qv. No es tan lindo sin el conocimiento de la entrada: https: // godbolt.org/g/LxEkhp – ZachB