Recientemente me he encontrado con lo que creo que es un problema de uso compartido falso y he buscado Sutter's article para alinear mis datos a líneas de caché. Se sugiere el siguiente código C++:Alineación de línea de caché (Necesita aclaración del artículo)
// C++ (using C++0x alignment syntax)
template<typename T>
struct cache_line_storage {
[[ align(CACHE_LINE_SIZE) ]] T data;
char pad[ CACHE_LINE_SIZE > sizeof(T)
? CACHE_LINE_SIZE - sizeof(T)
: 1 ];
};
puedo ver cómo esto funciona cuando CACHE_LINE_SIZE > sizeof(T)
es cierto - la estructura cache_line_storage
sólo termina tomando una línea de caché completa de la memoria. Sin embargo, cuando el sizeof(T)
es más grande que una sola línea de caché, creo que deberíamos rellenar los datos por CACHE_LINE_SIZE - T % CACHE_LINE_SIZE
bytes, de modo que la estructura resultante tenga un tamaño que sea un múltiplo entero del tamaño de la línea de caché. ¿Qué está mal con mi comprensión? ¿Por qué es suficiente el relleno con 1 byte?
+1, aunque en la práctica, no conozco ningún caso en el que una alineación de estructuras pueda ser mayor que el tamaño de la caché. Después de que todas las restricciones de alineación de tipo usualmente provienen de restricciones de caché. – Bahbar
¿La alineación se aplica a la estructura o al primer elemento de la estructura en su sugerencia? –
Pero en cuanto a la mecánica de compartir falsamente ... para evitarlo, ¿no debería 'T' alinearse con un múltiplo entero del tamaño de la línea de caché, incluso si' sizeof (T)> CACHE_LINE_SIZE'? ¿O esto no es necesario? – int3