Me he encontrado con un problema curioso. Un algoritmo que estoy trabajando consiste en un montón de cálculos de este tipoRendimiento de punto flotante de 32 bits frente a de 64 bits
q = x(0)*y(0)*z(0) + x(1)*y(1)*z(1) + ...
donde la longitud de la suma está entre 4 y 7.
Los cálculos originales se puede hacer todo el uso de precisión de 64 bits. Para la experimentación, traté de usar una precisión de 32 bits para los valores de entrada x, y, z (de modo que los cálculos se realizan usando 32 bits), y el almacenamiento del resultado final como un valor de 64 bits (conversión directa).
Espero que el rendimiento de 32 bits sea mejor (tamaño de caché, tamaño SIMD, etc.), pero para mi sorpresa no hubo diferencia en el rendimiento, incluso en la disminución.
La arquitectura en cuestión es Intel 64, Linux y GCC. Ambos códigos parecen usar SSE y las matrices en ambos casos están alineadas con el límite de 16 bytes.
¿Por qué sería así? Mi conjetura hasta ahora es que la precisión de 32 bits puede usar SSE solo en los primeros cuatro elementos, y el resto se hace en serie compuesto por la sobrecarga del elenco.
Agregaste una recompensa, ¿qué te gustó de la respuesta de dsimcha? También podría valer la pena probar el GCC más reciente que puedas o el compilador de Intel http://software.intel.com/en-us/articles/non-commercial-software-download/ para ver si hacen un mejor trabajo compilando/vectorizando . – Rup
@Rup Me gusta su respuesta, sin embargo, también me gustaría tener otras opiniones, así que puse una recompensa – Anycorn