Tag: heat

使用SIMD优化1D热方程

我正在使用CFD代码(用于计算流体动态)。 我最近有机会在我的一个循环中看到英特尔编译器使用SSE,在这个循环中为计算性能增加了近2倍的因子。 但是,使用SSE和SIMD指令似乎更像是运气。 大多数情况下,编译器什么都不做。 我正在尝试强制使用SSE,考虑到AVX指令将在不久的将来强化这一方面。 我做了一个简单的1D热转印代码。 它由两个阶段组成,使用另一个阶段的结果(U0 – > U1,然后是U1 – > U0,然后是U0 – > U1等)。 当它迭代时,它会收敛到稳定的解决方案。 主代码中的大部分循环都使用相同的计算方式。 (有限差分)。 但是,我的代码比普通循环慢两倍。 结果是相同的,因此计算是一致的。 我弄错了吗? 在使用Westmer进行测试之前,我正在使用Core 2来测试循环。 这是代码,带有SSE循环,然后是引用循环: #include #include #include //#include #define n1 1004 #define niter 200000 int i,j,t; double U0[n1] __attribute__ ((aligned(16))); double U1[n1] __attribute__ ((aligned(16))); double Dx,Dy,Lx,Ly,InvDxDx,Dt,alpha,totaltime,Stab,DtAlpha,DxDx; __m128d vmmx00; __m128d vmmx01; __m128d vmmx02; __m128d vmmx10; […]