@@ -62,6 +62,159 @@ template <class data_pipe, class res1_pipe, class res2_pipe, class res3_pipe, in
62
62
}
63
63
}
64
64
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
+
65
218
template <class data_pipe , class res_pipe , int N> void repack_stream () {
66
219
using data_T = typename ExtractPipeType<data_pipe>::value_type;
67
220
using res_T = typename ExtractPipeType<res_pipe>::value_type;
0 commit comments