📄 stencils.cc
字号:
template<typename T_stencil, typename T_numtype1, typename T_array2, class T_array3, typename T_array4, typename T_array5, typename T_array6, class T_array7, typename T_array8, typename T_array9, typename T_array10, class T_array11>void applyStencil_imp(const T_stencil& stencil, Array<T_numtype1,2>& A, T_array2& B, T_array3& C, T_array4& D, T_array5& E, T_array6& F, T_array7& G, T_array8& H, T_array9& I, T_array10& J, T_array11& K){ checkShapes(A,B,C,D,E,F,G,H,I,J,K); // Determine stencil extent TinyVector<int,2> minb, maxb; getStencilExtent(minb, maxb, stencil, A, B, C, D, E, F, G, H, I, J, K); // Now determine the subdomain over which the stencil // can be applied without worrying about overrunning the // boundaries of the array int stencil_lbound0 = minb(0); int stencil_lbound1 = minb(1); int stencil_ubound0 = maxb(0); int stencil_ubound1 = maxb(1); int lbound0 = minmax::max(A.lbound(0), A.lbound(0) - stencil_lbound0); int lbound1 = minmax::max(A.lbound(1), A.lbound(1) - stencil_lbound1); int ubound0 = minmax::min(A.ubound(0), A.ubound(0) - stencil_ubound0); int ubound1 = minmax::min(A.ubound(1), A.ubound(1) - stencil_ubound1);#if 0 cout << "Stencil bounds are:" << endl << lbound0 << '\t' << ubound0 << endl << lbound1 << '\t' << ubound1 << endl;#endif // Now do the actual loop FastArrayIterator<T_numtype1,2> Aiter(A); _bz_typename T_array2::T_iterator Biter(B); _bz_typename T_array3::T_iterator Citer(C); _bz_typename T_array4::T_iterator Diter(D); _bz_typename T_array5::T_iterator Eiter(E); _bz_typename T_array6::T_iterator Fiter(F); _bz_typename T_array7::T_iterator Giter(G); _bz_typename T_array8::T_iterator Hiter(H); _bz_typename T_array9::T_iterator Iiter(I); _bz_typename T_array10::T_iterator Jiter(J); _bz_typename T_array11::T_iterator Kiter(K); // Load the strides for the innermost loop Aiter.loadStride(1); Biter.loadStride(1); Citer.loadStride(1); Diter.loadStride(1); Eiter.loadStride(1); Fiter.loadStride(1); Giter.loadStride(1); Hiter.loadStride(1); Iiter.loadStride(1); Jiter.loadStride(1); Kiter.loadStride(1); for (int i=lbound0; i <= ubound0; ++i) { Aiter.moveTo(i,lbound1); Biter.moveTo(i,lbound1); Citer.moveTo(i,lbound1); Diter.moveTo(i,lbound1); Eiter.moveTo(i,lbound1); Fiter.moveTo(i,lbound1); Giter.moveTo(i,lbound1); Hiter.moveTo(i,lbound1); Iiter.moveTo(i,lbound1); Jiter.moveTo(i,lbound1); Kiter.moveTo(i,lbound1); for (int k=lbound1; k <= ubound1; ++k) { stencil.apply(Aiter, Biter, Citer, Diter, Eiter, Fiter, Giter, Hiter, Iiter, Jiter, Kiter); Aiter.advance(); Biter.advance(); Citer.advance(); Diter.advance(); Eiter.advance(); Fiter.advance(); Giter.advance(); Hiter.advance(); Iiter.advance(); Jiter.advance(); Kiter.advance(); } }}/* * This version applies a stencil to a set of 1D arrays. Up to 11 arrays * may be used. Any unused arrays are turned into dummyArray objects. * Operations on dummyArray objects are translated into no-ops. */template<typename T_stencil, typename T_numtype1, typename T_array2, class T_array3, typename T_array4, typename T_array5, typename T_array6, class T_array7, typename T_array8, typename T_array9, typename T_array10, class T_array11>void applyStencil_imp(const T_stencil& stencil, Array<T_numtype1,1>& A, T_array2& B, T_array3& C, T_array4& D, T_array5& E, T_array6& F, T_array7& G, T_array8& H, T_array9& I, T_array10& J, T_array11& K){ checkShapes(A,B,C,D,E,F,G,H,I,J,K); // Determine stencil extent TinyVector<int,1> minb, maxb; getStencilExtent(minb, maxb, stencil, A, B, C, D, E, F, G, H, I, J, K); // Now determine the subdomain over which the stencil // can be applied without worrying about overrunning the // boundaries of the array int stencil_lbound0 = minb(0); int stencil_ubound0 = maxb(0); int lbound0 = minmax::max(A.lbound(0), A.lbound(0) - stencil_lbound0); int ubound0 = minmax::min(A.ubound(0), A.ubound(0) - stencil_ubound0);#if 0 cout << "Stencil bounds are:" << endl << lbound0 << '\t' << ubound0 << endl;#endif // Now do the actual loop FastArrayIterator<T_numtype1,1> Aiter(A); _bz_typename T_array2::T_iterator Biter(B); _bz_typename T_array3::T_iterator Citer(C); _bz_typename T_array4::T_iterator Diter(D); _bz_typename T_array5::T_iterator Eiter(E); _bz_typename T_array6::T_iterator Fiter(F); _bz_typename T_array7::T_iterator Giter(G); _bz_typename T_array8::T_iterator Hiter(H); _bz_typename T_array9::T_iterator Iiter(I); _bz_typename T_array10::T_iterator Jiter(J); _bz_typename T_array11::T_iterator Kiter(K); // Load the strides for the innermost loop Aiter.loadStride(0); Biter.loadStride(0); Citer.loadStride(0); Diter.loadStride(0); Eiter.loadStride(0); Fiter.loadStride(0); Giter.loadStride(0); Hiter.loadStride(0); Iiter.loadStride(0); Jiter.loadStride(0); Kiter.loadStride(0); // Patch from Derrick Bass Aiter.moveTo(lbound0); Biter.moveTo(lbound0); Citer.moveTo(lbound0); Diter.moveTo(lbound0); Eiter.moveTo(lbound0); Fiter.moveTo(lbound0); Giter.moveTo(lbound0); Hiter.moveTo(lbound0); Iiter.moveTo(lbound0); Jiter.moveTo(lbound0); Kiter.moveTo(lbound0); for (int i=lbound0; i <= ubound0; ++i) { stencil.apply(Aiter, Biter, Citer, Diter, Eiter, Fiter, Giter, Hiter, Iiter, Jiter, Kiter); Aiter.advance(); Biter.advance(); Citer.advance(); Diter.advance(); Eiter.advance(); Fiter.advance(); Giter.advance(); Hiter.advance(); Iiter.advance(); Jiter.advance(); Kiter.advance(); }}/* * These 11 versions of applyStencil handle from 1 to 11 array parameters. * They pad their argument list with enough dummyArray objects to call * applyStencil_imp with 11 array parameters. */template<typename T_stencil, typename T_numtype1, int N_rank>inline void applyStencil(const T_stencil& stencil, Array<T_numtype1,N_rank>& A){ applyStencil_imp(stencil, A, _dummyArray, _dummyArray, _dummyArray, _dummyArray, _dummyArray, _dummyArray, _dummyArray, _dummyArray, _dummyArray, _dummyArray);}template<typename T_stencil, typename T_numtype1, int N_rank, typename T_array2>inline void applyStencil(const T_stencil& stencil, Array<T_numtype1,N_rank>& A, T_array2& B){ applyStencil_imp(stencil, A, B, _dummyArray, _dummyArray, _dummyArray, _dummyArray, _dummyArray, _dummyArray, _dummyArray, _dummyArray, _dummyArray);}template<typename T_stencil, typename T_numtype1, int N_rank, typename T_array2, class T_array3>inline void applyStencil(const T_stencil& stencil, Array<T_numtype1,N_rank>& A, T_array2& B, T_array3& C){ applyStencil_imp(stencil, A, B, C, _dummyArray, _dummyArray, _dummyArray, _dummyArray, _dummyArray, _dummyArray, _dummyArray, _dummyArray);}template<typename T_stencil, typename T_numtype1, int N_rank, typename T_array2, class T_array3, typename T_array4>inline void applyStencil(const T_stencil& stencil, Array<T_numtype1,N_rank>& A, T_array2& B, T_array3& C, T_array4& D){ applyStencil_imp(stencil, A, B, C, D, _dummyArray, _dummyArray, _dummyArray, _dummyArray, _dummyArray, _dummyArray, _dummyArray);}template<typename T_stencil, typename T_numtype1, int N_rank, typename T_array2, class T_array3, typename T_array4, typename T_array5>inline void applyStencil(const T_stencil& stencil, Array<T_numtype1,N_rank>& A, T_array2& B, T_array3& C, T_array4& D, T_array5& E){ applyStencil_imp(stencil, A, B, C, D, E, _dummyArray, _dummyArray, _dummyArray, _dummyArray, _dummyArray, _dummyArray);}template<typename T_stencil, typename T_numtype1, int N_rank, typename T_array2, class T_array3, typename T_array4, typename T_array5, typename T_array6>inline void applyStencil(const T_stencil& stencil, Array<T_numtype1,N_rank>& A, T_array2& B, T_array3& C, T_array4& D, T_array5& E, T_array6& F){ applyStencil_imp(stencil, A, B, C, D, E, F, _dummyArray, _dummyArray, _dummyArray, _dummyArray, _dummyArray);}template<typename T_stencil, typename T_numtype1, int N_rank, typename T_array2, class T_array3, typename T_array4, typename T_array5, typename T_array6, class T_array7>inline void applyStencil(const T_stencil& stencil, Array<T_numtype1,N_rank>& A, T_array2& B, T_array3& C, T_array4& D, T_array5& E, T_array6& F, T_array7& G){ applyStencil_imp(stencil, A, B, C, D, E, F, G, _dummyArray, _dummyArray, _dummyArray, _dummyArray);}template<typename T_stencil, typename T_numtype1, int N_rank, typename T_array2, class T_array3, typename T_array4, typename T_array5, typename T_array6, class T_array7, typename T_array8>inline void applyStencil(const T_stencil& stencil, Array<T_numtype1,N_rank>& A, T_array2& B, T_array3& C, T_array4& D, T_array5& E, T_array6& F, T_array7& G, T_array8& H){ applyStencil_imp(stencil, A, B, C, D, E, F, G, H, _dummyArray, _dummyArray, _dummyArray);}template<typename T_stencil, typename T_numtype1, int N_rank, typename T_array2, class T_array3, typename T_array4, typename T_array5, typename T_array6, class T_array7, typename T_array8, typename T_array9>inline void applyStencil(const T_stencil& stencil, Array<T_numtype1,N_rank>& A, T_array2& B, T_array3& C, T_array4& D, T_array5& E, T_array6& F, T_array7& G, T_array8& H, T_array9& I){ applyStencil_imp(stencil, A, B, C, D, E, F, G, H, I, _dummyArray, _dummyArray);}template<typename T_stencil, typename T_numtype1, int N_rank, typename T_array2, class T_array3, typename T_array4, typename T_array5, typename T_array6, class T_array7, typename T_array8, typename T_array9, typename T_array10>inline void applyStencil(const T_stencil& stencil, Array<T_numtype1,N_rank>& A, T_array2& B, T_array3& C, T_array4& D, T_array5& E, T_array6& F, T_array7& G, T_array8& H, T_array9& I, T_array10& J){ applyStencil_imp(stencil, A, B, C, D, E, F, G, H, I, J, _dummyArray);}template<typename T_stencil, typename T_numtype1, int N_rank, typename T_array2, class T_array3, typename T_array4, typename T_array5, typename T_array6, class T_array7, typename T_array8, typename T_array9, typename T_array10, class T_array11>inline void applyStencil(const T_stencil& stencil, Array<T_numtype1,N_rank>& A, T_array2& B, T_array3& C, T_array4& D, T_array5& E, T_array6& F, T_array7& G, T_array8& H, T_array9& I, T_array10& J, T_array11& K){ applyStencil_imp(stencil, A, B, C, D, E, F, G, H, I, J, K);}BZ_NAMESPACE_END#endif // BZ_ARRAYSTENCIL_CC
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -