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 [] […]
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 […]
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?
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 […]
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 […]
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 […]
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) […]
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 […]
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 […]
¿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 […]