算法计算瓶颈:主要集中在SIMD指令计算的过程中,取 __m256d 其中一个元素或者置一个元素为零。
问题一:置__m256d一个元素为0,但是AVX256没有掩码操作。
初步解决 :使用 _mm256_set_pd() 指令把要置0的位置设为0,其他位置设为1,再使用_mm256_mul_pd() 指令做乘法。
后期改进:使用 _mm256_set_pd() 指令设置mask,在使用_mm256_and_pd() ,每次写回可以降低4-5个时钟周期cycle。
问题二:取 __m256d 其中一个元素(double 类型) 。
目前方案:( (double*)&a )[idx] , 太慢了,AVX256没有reduce指令,有待解决。
问题三:AVX256-SSE指令切换会浪费100个cycle。
解决方案:查英特尔手册Avoiding AVX-SSE Transition Penalties。其中第一种方法似乎没什么优化效果,第二种反而会造成结果错误。
问题四:改多线程之后,同样的代码,运行一次结果正确,连续调用第二次结果出错。
发现问题:并行域中的SIMD指令单元,定义时不初始化就会导致连续第二次结果出错,在定义时初始化。
暂存疑惑:所有的变量均为线程内局部变量,为什么会导致第一次运行影响了第二次运行的结果。
问题五:待更。。。
学长说,要对于数据有自己的思考,即使做崩了也要分析出为什么崩。
学长说,一切都是有原因的。