@@ -62,6 +62,159 @@ template <class data_pipe, class res1_pipe, class res2_pipe, class res3_pipe, in
6262 }
6363}
6464
65+ template <class data_pipe , class res1_pipe , class res2_pipe , class res3_pipe , class res4_pipe , int N> void clone_stream () {
66+ using data_T = typename ExtractPipeType<data_pipe>::value_type;
67+ using res1_T = typename ExtractPipeType<res1_pipe>::value_type;
68+ using res2_T = typename ExtractPipeType<res2_pipe>::value_type;
69+ using res3_T = typename ExtractPipeType<res3_pipe>::value_type;
70+ using res4_T = typename ExtractPipeType<res4_pipe>::value_type;
71+ constexpr auto datasize = std::tuple_size<data_T>{};
72+ CloneLoop:
73+ [[intel::initiation_interval (1 )]] for (int i = 0 ; i < N / datasize; i++) {
74+ data_T in_data = data_pipe::read ();
75+ res1_T out_data1;
76+ res2_T out_data2;
77+ res3_T out_data3;
78+ res4_T out_data4;
79+
80+ ClonePack:
81+ #pragma unroll
82+ for (int j = 0 ; j < datasize; j++) {
83+ out_data1[j] = in_data[j];
84+ out_data2[j] = in_data[j];
85+ out_data3[j] = in_data[j];
86+ out_data4[j] = in_data[j];
87+ }
88+
89+ res1_pipe::write (out_data1);
90+ res2_pipe::write (out_data2);
91+ res3_pipe::write (out_data3);
92+ res4_pipe::write (out_data4);
93+ }
94+ }
95+
96+ template <class data_pipe , class res1_pipe , class res2_pipe , class res3_pipe , class res4_pipe , class res5_pipe , int N>
97+ void clone_stream () {
98+ using data_T = typename ExtractPipeType<data_pipe>::value_type;
99+ using res1_T = typename ExtractPipeType<res1_pipe>::value_type;
100+ using res2_T = typename ExtractPipeType<res2_pipe>::value_type;
101+ using res3_T = typename ExtractPipeType<res3_pipe>::value_type;
102+ using res4_T = typename ExtractPipeType<res4_pipe>::value_type;
103+ using res5_T = typename ExtractPipeType<res5_pipe>::value_type;
104+ constexpr auto datasize = std::tuple_size<data_T>{};
105+ CloneLoop:
106+ [[intel::initiation_interval (1 )]] for (int i = 0 ; i < N / datasize; i++) {
107+ data_T in_data = data_pipe::read ();
108+ res1_T out_data1;
109+ res2_T out_data2;
110+ res3_T out_data3;
111+ res4_T out_data4;
112+ res5_T out_data5;
113+
114+ ClonePack:
115+ #pragma unroll
116+ for (int j = 0 ; j < datasize; j++) {
117+ out_data1[j] = in_data[j];
118+ out_data2[j] = in_data[j];
119+ out_data3[j] = in_data[j];
120+ out_data4[j] = in_data[j];
121+ out_data5[j] = in_data[j];
122+ }
123+
124+ res1_pipe::write (out_data1);
125+ res2_pipe::write (out_data2);
126+ res3_pipe::write (out_data3);
127+ res4_pipe::write (out_data4);
128+ res5_pipe::write (out_data5);
129+ }
130+ }
131+
132+ template <class data_pipe , class res1_pipe , class res2_pipe , class res3_pipe , class res4_pipe , class res5_pipe ,
133+ class res6_pipe , int N>
134+ void clone_stream () {
135+ using data_T = typename ExtractPipeType<data_pipe>::value_type;
136+ using res1_T = typename ExtractPipeType<res1_pipe>::value_type;
137+ using res2_T = typename ExtractPipeType<res2_pipe>::value_type;
138+ using res3_T = typename ExtractPipeType<res3_pipe>::value_type;
139+ using res4_T = typename ExtractPipeType<res4_pipe>::value_type;
140+ using res5_T = typename ExtractPipeType<res5_pipe>::value_type;
141+ using res6_T = typename ExtractPipeType<res6_pipe>::value_type;
142+ constexpr auto datasize = std::tuple_size<data_T>{};
143+ CloneLoop:
144+ [[intel::initiation_interval (1 )]] for (int i = 0 ; i < N / datasize; i++) {
145+ data_T in_data = data_pipe::read ();
146+ res1_T out_data1;
147+ res2_T out_data2;
148+ res3_T out_data3;
149+ res4_T out_data4;
150+ res5_T out_data5;
151+ res6_T out_data6;
152+
153+ ClonePack:
154+ #pragma unroll
155+ for (int j = 0 ; j < datasize; j++) {
156+ out_data1[j] = in_data[j];
157+ out_data2[j] = in_data[j];
158+ out_data3[j] = in_data[j];
159+ out_data4[j] = in_data[j];
160+ out_data5[j] = in_data[j];
161+ out_data6[j] = in_data[j];
162+ }
163+
164+ res1_pipe::write (out_data1);
165+ res2_pipe::write (out_data2);
166+ res3_pipe::write (out_data3);
167+ res4_pipe::write (out_data4);
168+ res5_pipe::write (out_data5);
169+ res6_pipe::write (out_data6);
170+ }
171+ }
172+
173+ template <class data_pipe , class res1_pipe , class res2_pipe , class res3_pipe , class res4_pipe , class res5_pipe ,
174+ class res6_pipe , class res7_pipe , int N>
175+ void clone_stream () {
176+ using data_T = typename ExtractPipeType<data_pipe>::value_type;
177+ using res1_T = typename ExtractPipeType<res1_pipe>::value_type;
178+ using res2_T = typename ExtractPipeType<res2_pipe>::value_type;
179+ using res3_T = typename ExtractPipeType<res3_pipe>::value_type;
180+ using res4_T = typename ExtractPipeType<res4_pipe>::value_type;
181+ using res5_T = typename ExtractPipeType<res5_pipe>::value_type;
182+ using res6_T = typename ExtractPipeType<res6_pipe>::value_type;
183+ using res7_T = typename ExtractPipeType<res7_pipe>::value_type;
184+ constexpr auto datasize = std::tuple_size<data_T>{};
185+ CloneLoop:
186+ [[intel::initiation_interval (1 )]] for (int i = 0 ; i < N / datasize; i++) {
187+ data_T in_data = data_pipe::read ();
188+ res1_T out_data1;
189+ res2_T out_data2;
190+ res3_T out_data3;
191+ res4_T out_data4;
192+ res5_T out_data5;
193+ res6_T out_data6;
194+ res7_T out_data7;
195+
196+ ClonePack:
197+ #pragma unroll
198+ for (int j = 0 ; j < datasize; j++) {
199+ out_data1[j] = in_data[j];
200+ out_data2[j] = in_data[j];
201+ out_data3[j] = in_data[j];
202+ out_data4[j] = in_data[j];
203+ out_data5[j] = in_data[j];
204+ out_data6[j] = in_data[j];
205+ out_data7[j] = in_data[j];
206+ }
207+
208+ res1_pipe::write (out_data1);
209+ res2_pipe::write (out_data2);
210+ res3_pipe::write (out_data3);
211+ res4_pipe::write (out_data4);
212+ res5_pipe::write (out_data5);
213+ res6_pipe::write (out_data6);
214+ res6_pipe::write (out_data7);
215+ }
216+ }
217+
65218template <class data_pipe , class res_pipe , int N> void repack_stream () {
66219 using data_T = typename ExtractPipeType<data_pipe>::value_type;
67220 using res_T = typename ExtractPipeType<res_pipe>::value_type;
0 commit comments