Articles of avx

¿Cómo resolver el problema de alineación de 32 bytes para las operaciones de carga / almacenamiento de AVX?

Estoy teniendo un problema de alineación al usar registros ymm , con algunos fragmentos de código que me parecen bien. Aquí hay un ejemplo de trabajo mínimo: #include #include inline void ones(float *a) { __m256 out_aligned = _mm256_set1_ps(1.0f); _mm256_store_ps(a,out_aligned); } int main() { size_t ss = 8; float *a = new float[ss]; ones(a); delete [] […]

¿Hay una instrucción inversa a la instrucción movemask en Intel avx2?

Las instrucciones movemask toman un __m256i y devuelven un int32 donde cada bit (el primero 4, 8 o los 32 bits dependiendo del tipo de elemento vector de entrada) es el bit más significativo del elemento vector correspondiente. Me gustaría hacer lo contrario: tomar un 32 (donde solo los 4, 8 o 32 bits menos […]

¿Cómo realizar conversiones dobles / int64 de manera eficiente con SSE / AVX?

SSE2 tiene instrucciones para convertir vectores entre flotantes de precisión simple e enteros de 32 bits. _mm_cvtps_epi32() _mm_cvtepi32_ps() Pero no hay equivalentes para enteros de doble precisión y de 64 bits. En otras palabras, faltan: _mm_cvtpd_epi64() _mm_cvtepi64_pd() Parece que AVX tampoco los tiene. ¿Cuál es la forma más eficiente de simular estos intrínsecos?

Cómo usar las instrucciones Fused Multiply-Add (FMA) con SSE / AVX

Aprendí que algunas CPU Intel / AMD pueden multiplicarse simultáneamente y agregarse con SSE / AVX: FLOPS por ciclo para sandy-bridge y haswell SSE2 / AVX / AVX2 . Me gusta saber cómo hacer esto mejor en el código y también quiero saber cómo se hace internamente en la CPU. Me refiero a la architecture […]

Uso de las instrucciones de la CPU AVX: bajo rendimiento sin “/ arch: AVX”

Mi código C ++ usa SSE y ahora quiero mejorarlo para que sea compatible con AVX cuando esté disponible. Entonces detecto cuando AVX está disponible y llamo a una función que usa comandos AVX. Uso Win7 SP1 + VS2010 SP1 y una CPU con AVX. Para usar AVX, es necesario incluir esto: #include “immintrin.h” y […]

¿Cómo realizar el inverso de _mm256_movemask_epi8 (VPMOVMSKB)?

Lo intrínseco int mask = _mm256_movemask_epi8(__m256i s1) crea una máscara, con sus 32 bits correspondientes al bit más significativo de cada byte de s1 . Después de manipular la máscara usando operaciones de bits ( BMI2 por ejemplo) me gustaría realizar el inverso de _mm256_movemask_epi8 , es decir, crear un vector __m256i con el bit […]

¿Qué falta / no es óptimo en esta implementación de memcpy?

Me interesé en escribir un memcpy() como ejercicio educativo. No escribiré un tratado completo de lo que hice y lo que no pensé, pero aquí está la implementación de un tipo : __forceinline //因为通常Size已知,内联后编译器可以优化掉大部分无用代码void* myMemcpy(char* Dst, const char* Src, size_t Size) { void* start = Dst; for ( ; Size >= sizeof(__m256i); Size -= sizeof(__m256i) […]

Vectorizar con almacenamientos intermedios no alineados: usar VMASKMOVPS: ¿generar una máscara a partir de un recuento de desalineación? O no usar ese nombre en absoluto

gcc 5.3 con -O3 -mavx -mtune=haswell para x86-64 hace un código sorprendentemente voluminoso para manejar entradas potencialmente desalineadas para código como: // convenient simple example of compiler input // I’m not actually interested in this for any real program void floatmul(float *a) { for (int i=0; i<1024 ; i++) a[i] *= 2; } clang usa […]

¿Por qué este código SSE es 6 veces más lento sin VZEROUPPER en Skylake?

He estado tratando de descubrir un problema de rendimiento en una aplicación y finalmente lo reduje a un problema realmente extraño. El siguiente fragmento de código se ejecuta 6 veces más lento en una CPU Skylake (i5-6500) si la instrucción VZEROUPPER está comentada. VZEROUPPER CPU Sandy Bridge e Ivy Bridge y ambas versiones funcionan a […]

¿Cómo verificar si una CPU admite el conjunto de instrucciones SSE3?

¿Es válido el siguiente código para verificar si una CPU admite el conjunto de instrucciones SSE3? El uso de la función IsProcessorFeaturePresent() aparentemente no funciona en Windows XP (consulte http://msdn.microsoft.com/en-us/library/ms724482(v=vs.85).aspx ). bool CheckSSE3() { int CPUInfo[4] = {-1}; //– Get number of valid info ids __cpuid(CPUInfo, 0); int nIds = CPUInfo[0]; //– Get info for […]