1 /******************************************************************************
\r
3 * Copyright (c) 2019 Intel.
\r
5 * Licensed under the Apache License, Version 2.0 (the "License");
\r
6 * you may not use this file except in compliance with the License.
\r
7 * You may obtain a copy of the License at
\r
9 * http://www.apache.org/licenses/LICENSE-2.0
\r
11 * Unless required by applicable law or agreed to in writing, software
\r
12 * distributed under the License is distributed on an "AS IS" BASIS,
\r
13 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
\r
14 * See the License for the specific language governing permissions and
\r
15 * limitations under the License.
\r
17 *******************************************************************************/
\r
19 #include "common.hpp"
\r
20 #include "xran_fh_o_du.h"
\r
21 #include "xran_compression.h"
\r
22 #include "xran_compression.hpp"
\r
26 #include <algorithm>
\r
31 const std::string module_name = "bfp";
\r
33 template <typename T>
\r
34 int checkData(T* inVec1, T* inVec2, int numVals)
\r
37 for (int n = 0; n < numVals; ++n)
\r
39 checkSum += std::abs(inVec1[n] - inVec2[n]);
\r
43 //std::cout << "Test Passed\n";
\r
48 //std::cout << "Test Failed\n";
\r
52 template int checkData(int8_t*, int8_t*, int);
\r
53 template int checkData(int16_t*, int16_t*, int);
\r
55 int checkDataApprox(int16_t *inVec1, int16_t *inVec2, int numVals)
\r
58 for (int n = 0; n < numVals; ++n)
\r
60 if (std::abs(inVec1[n] & 0xFF00) - std::abs(inVec2[n] & 0xFF00)){;
\r
61 printf("%d %d\n", inVec1[n] & 0xFF00, inVec2[n] & 0xFF00);
\r
67 //std::cout << "Test Passed\n";
\r
72 //std::cout << "Test Failed\n";
\r
78 class BfpCheck : public KernelTests
\r
81 void SetUp() override {
\r
82 init_test("bfp_functional");
\r
85 /* It's called after an execution of the each test case.*/
\r
86 void TearDown() override {
\r
90 class BfpPerf : public KernelTests
\r
93 void SetUp() override {
\r
94 init_test("bfp_performace");
\r
97 /* It's called after an execution of the each test case.*/
\r
98 void TearDown() override {
\r
101 CACHE_ALIGNED int16_t loc_dataExpandedIn[288*BlockFloatCompander::k_numREReal];
\r
102 CACHE_ALIGNED int16_t loc_dataExpandedRes[288*BlockFloatCompander::k_numREReal];
\r
103 CACHE_ALIGNED uint8_t loc_dataCompressedDataOut[2*288*BlockFloatCompander::k_numREReal];
\r
105 class BfpPerfEx : public KernelTests
\r
108 struct xranlib_decompress_request bfp_decom_req;
\r
109 struct xranlib_decompress_response bfp_decom_rsp;
\r
110 struct xranlib_compress_request bfp_com_req;
\r
111 struct xranlib_compress_response bfp_com_rsp;
\r
113 void SetUp() override {
\r
114 init_test("bfp_performace_ex");
\r
115 int32_t resSum = 0;
\r
117 int16_t compMethod = XRAN_COMPMETHOD_BLKFLOAT;
\r
118 int16_t iqWidth = get_input_parameter<int16_t>("iqWidth");
\r
119 int16_t numRBs = get_input_parameter<int16_t>("nRBsize");
\r
120 // Create random number generator
\r
121 std::random_device rd;
\r
122 std::mt19937 gen(rd()); //Standard mersenne_twister_engine seeded with rd()
\r
123 std::uniform_int_distribution<int16_t> randInt16(-32768, 32767);
\r
124 std::uniform_int_distribution<int> randExpShift(0, 4);
\r
126 BlockFloatCompander::ExpandedData expandedData;
\r
127 expandedData.dataExpanded = &loc_dataExpandedIn[0];
\r
128 BlockFloatCompander::ExpandedData expandedDataRes;
\r
129 expandedDataRes.dataExpanded = &loc_dataExpandedRes[0];
\r
131 //printf("iqWidth %d numRBs %d\n", iqWidth, numRBs);
\r
133 for (int m = 0; m < 18*BlockFloatCompander::k_numRB; ++m) {
\r
134 auto shiftVal = randExpShift(gen);
\r
135 for (int n = 0; n < BlockFloatCompander::k_numREReal; ++n) {
\r
136 expandedData.dataExpanded[m*BlockFloatCompander::k_numREReal+n] = int16_t(randInt16(gen) >> shiftVal);
\r
140 BlockFloatCompander::CompressedData compressedData;
\r
141 compressedData.dataCompressed = &loc_dataCompressedDataOut[0];
\r
143 std::memset(&loc_dataCompressedDataOut[0], 0, 288*BlockFloatCompander::k_numREReal);
\r
144 std::memset(&loc_dataExpandedRes[0], 0, 288*BlockFloatCompander::k_numREReal);
\r
146 std::memset(&bfp_com_req, 0, sizeof(struct xranlib_compress_request));
\r
147 std::memset(&bfp_com_rsp, 0, sizeof(struct xranlib_compress_response));
\r
148 std::memset(&bfp_decom_req, 0, sizeof(struct xranlib_decompress_request));
\r
149 std::memset(&bfp_decom_rsp, 0, sizeof(struct xranlib_decompress_response));
\r
151 bfp_com_req.data_in = (int16_t *)expandedData.dataExpanded;
\r
152 bfp_com_req.numRBs = numRBs;
\r
153 bfp_com_req.len = numRBs*12*2*2;
\r
154 bfp_com_req.compMethod = compMethod;
\r
155 bfp_com_req.iqWidth = iqWidth;
\r
157 bfp_com_rsp.data_out = (int8_t *)(compressedData.dataCompressed);
\r
158 bfp_com_rsp.len = 0;
\r
160 bfp_decom_req.data_in = (int8_t *)(compressedData.dataCompressed);
\r
161 bfp_decom_req.numRBs = numRBs;
\r
162 bfp_decom_req.len = ((3 * iqWidth) + 1) * numRBs;
\r
163 bfp_decom_req.compMethod = compMethod;
\r
164 bfp_decom_req.iqWidth = iqWidth;
\r
166 bfp_decom_rsp.data_out = (int16_t *)expandedDataRes.dataExpanded;
\r
167 bfp_decom_rsp.len = 0;
\r
170 /* It's called after an execution of the each test case.*/
\r
171 void TearDown() override {
\r
176 TEST_P(BfpCheck, AVX512_12bit)
\r
180 // Create random number generator
\r
181 std::random_device rd;
\r
182 std::mt19937 gen(rd()); //Standard mersenne_twister_engine seeded with rd()
\r
183 std::uniform_int_distribution<int16_t> randInt16(-32768, 32767);
\r
184 std::uniform_int_distribution<int> randExpShift(0, 4);
\r
186 // Generate random test data for compression kernel
\r
187 BlockFloatCompander::ExpandedData expandedDataInput;
\r
188 expandedDataInput.dataExpanded = &expandedDataInput.dataExpandedIn[0];
\r
189 for (int m = 0; m < BlockFloatCompander::k_numRB; ++m)
\r
191 auto shiftVal = randExpShift(gen);
\r
192 for (int n = 0; n < BlockFloatCompander::k_numREReal; ++n)
\r
194 expandedDataInput.dataExpanded[m*BlockFloatCompander::k_numREReal+n] = int16_t(randInt16(gen) >> shiftVal);
\r
198 BlockFloatCompander::CompressedData compressedDataRef;
\r
199 compressedDataRef.dataCompressed = &compressedDataRef.dataCompressedDataOut[0];
\r
200 BlockFloatCompander::ExpandedData expandedDataRef;
\r
201 expandedDataRef.dataExpanded = &expandedDataRef.dataExpandedIn[0];
\r
202 BlockFloatCompander::CompressedData compressedDataKern;
\r
203 compressedDataKern.dataCompressed = &compressedDataKern.dataCompressedDataOut[0];
\r
204 BlockFloatCompander::ExpandedData expandedDataKern;
\r
205 expandedDataKern.dataExpanded = &expandedDataKern.dataExpandedIn[0];
\r
207 //std::cout << "Verifying AVX512 12b iqWidth Kernel\n";
\r
208 expandedDataInput.iqWidth = 12;
\r
209 // Generate reference
\r
210 BlockFloatCompander::BlockFloatCompress_Basic(expandedDataInput, &compressedDataRef);
\r
211 BlockFloatCompander::BlockFloatExpand_Basic(compressedDataRef, &expandedDataRef);
\r
212 // Generate kernel output
\r
213 BlockFloatCompander::BlockFloatCompress_12b_AVX512(expandedDataInput, &compressedDataKern);
\r
214 BlockFloatCompander::BlockFloatExpand_12b_AVX512(compressedDataRef, &expandedDataKern);
\r
216 auto totNumBytes = ((3 * compressedDataRef.iqWidth) + 1) * BlockFloatCompander::k_numRB;
\r
217 //std::cout << "Compression: ";
\r
218 resSum += checkData(compressedDataRef.dataCompressed, compressedDataKern.dataCompressed, totNumBytes);
\r
219 //std::cout << "Expansion: ";
\r
220 resSum += checkData(expandedDataRef.dataExpanded, expandedDataKern.dataExpanded, BlockFloatCompander::k_numSampsExpanded);
\r
222 ASSERT_EQ(0, resSum);
\r
225 TEST_P(BfpCheck, AVX512_10bit)
\r
229 // Create random number generator
\r
230 std::random_device rd;
\r
231 std::mt19937 gen(rd()); //Standard mersenne_twister_engine seeded with rd()
\r
232 std::uniform_int_distribution<int16_t> randInt16(-32768, 32767);
\r
233 std::uniform_int_distribution<int> randExpShift(0, 4);
\r
235 // Generate random test data for compression kernel
\r
236 BlockFloatCompander::ExpandedData expandedDataInput;
\r
237 expandedDataInput.dataExpanded = &expandedDataInput.dataExpandedIn[0];
\r
238 for (int m = 0; m < BlockFloatCompander::k_numRB; ++m)
\r
240 auto shiftVal = randExpShift(gen);
\r
241 for (int n = 0; n < BlockFloatCompander::k_numREReal; ++n)
\r
243 expandedDataInput.dataExpanded[m*BlockFloatCompander::k_numREReal+n] = int16_t(randInt16(gen) >> shiftVal);
\r
247 BlockFloatCompander::CompressedData compressedDataRef;
\r
248 compressedDataRef.dataCompressed = &compressedDataRef.dataCompressedDataOut[0];
\r
249 BlockFloatCompander::ExpandedData expandedDataRef;
\r
250 expandedDataRef.dataExpanded = &expandedDataRef.dataExpandedIn[0];
\r
251 BlockFloatCompander::CompressedData compressedDataKern;
\r
252 compressedDataKern.dataCompressed = &compressedDataKern.dataCompressedDataOut[0];
\r
253 BlockFloatCompander::ExpandedData expandedDataKern;
\r
254 expandedDataKern.dataExpanded = &expandedDataKern.dataExpandedIn[0];
\r
256 //std::cout << "Verifying AVX512 10b iqWidth Kernel\n";
\r
257 expandedDataInput.iqWidth = 10;
\r
258 // Generate reference
\r
259 BlockFloatCompander::BlockFloatCompress_Basic(expandedDataInput, &compressedDataRef);
\r
260 BlockFloatCompander::BlockFloatExpand_Basic(compressedDataRef, &expandedDataRef);
\r
261 // Generate kernel output
\r
262 BlockFloatCompander::BlockFloatCompress_10b_AVX512(expandedDataInput, &compressedDataKern);
\r
263 BlockFloatCompander::BlockFloatExpand_10b_AVX512(compressedDataRef, &expandedDataKern);
\r
265 auto totNumBytes = ((3 * compressedDataRef.iqWidth) + 1) * BlockFloatCompander::k_numRB;
\r
266 //std::cout << "Compression: ";
\r
267 resSum += checkData(compressedDataRef.dataCompressed, compressedDataKern.dataCompressed, totNumBytes);
\r
268 //std::cout << "Expansion: ";
\r
269 resSum += checkData(expandedDataRef.dataExpanded, expandedDataKern.dataExpanded, BlockFloatCompander::k_numSampsExpanded);
\r
271 ASSERT_EQ(0, resSum);
\r
273 // performance("AVX512", module_name, BlockFloatCompander::BlockFloatCompress_10b_AVX512, expandedDataInput, &compressedDataKern);
\r
276 TEST_P(BfpCheck, AVX512_9bit)
\r
280 // Create random number generator
\r
281 std::random_device rd;
\r
282 std::mt19937 gen(rd()); //Standard mersenne_twister_engine seeded with rd()
\r
283 std::uniform_int_distribution<int16_t> randInt16(-32768, 32767);
\r
284 std::uniform_int_distribution<int> randExpShift(0, 4);
\r
286 // Generate random test data for compression kernel
\r
287 BlockFloatCompander::ExpandedData expandedDataInput;
\r
288 expandedDataInput.dataExpanded = &expandedDataInput.dataExpandedIn[0];
\r
289 for (int m = 0; m < BlockFloatCompander::k_numRB; ++m)
\r
291 auto shiftVal = randExpShift(gen);
\r
292 for (int n = 0; n < BlockFloatCompander::k_numREReal; ++n)
\r
294 expandedDataInput.dataExpanded[m*BlockFloatCompander::k_numREReal+n] = int16_t(randInt16(gen) >> shiftVal);
\r
298 BlockFloatCompander::CompressedData compressedDataRef;
\r
299 compressedDataRef.dataCompressed = &compressedDataRef.dataCompressedDataOut[0];
\r
300 BlockFloatCompander::ExpandedData expandedDataRef;
\r
301 expandedDataRef.dataExpanded = &expandedDataRef.dataExpandedIn[0];
\r
302 BlockFloatCompander::CompressedData compressedDataKern;
\r
303 compressedDataKern.dataCompressed = &compressedDataKern.dataCompressedDataOut[0];
\r
304 BlockFloatCompander::ExpandedData expandedDataKern;
\r
305 expandedDataKern.dataExpanded = &expandedDataKern.dataExpandedIn[0];
\r
307 //std::cout << "Verifying AVX512 9b iqWidth Kernel\n";
\r
308 expandedDataInput.iqWidth = 9;
\r
309 // Generate reference
\r
310 BlockFloatCompander::BlockFloatCompress_Basic(expandedDataInput, &compressedDataRef);
\r
311 BlockFloatCompander::BlockFloatExpand_Basic(compressedDataRef, &expandedDataRef);
\r
312 // Generate kernel output
\r
313 BlockFloatCompander::BlockFloatCompress_9b_AVX512(expandedDataInput, &compressedDataKern);
\r
314 BlockFloatCompander::BlockFloatExpand_9b_AVX512(compressedDataRef, &expandedDataKern);
\r
316 auto totNumBytes = ((3 * compressedDataRef.iqWidth) + 1) * BlockFloatCompander::k_numRB;
\r
317 //std::cout << "Compression: ";
\r
318 resSum += checkData(compressedDataRef.dataCompressed, compressedDataKern.dataCompressed, totNumBytes);
\r
319 //std::cout << "Expansion: ";
\r
320 resSum += checkData(expandedDataRef.dataExpanded, expandedDataKern.dataExpanded, BlockFloatCompander::k_numSampsExpanded);
\r
322 ASSERT_EQ(0, resSum);
\r
326 TEST_P(BfpCheck, AVX512_8bit)
\r
330 // Create random number generator
\r
331 std::random_device rd;
\r
332 std::mt19937 gen(rd()); //Standard mersenne_twister_engine seeded with rd()
\r
333 std::uniform_int_distribution<int16_t> randInt16(-32768, 32767);
\r
334 std::uniform_int_distribution<int> randExpShift(0, 4);
\r
336 // Generate random test data for compression kernel
\r
337 BlockFloatCompander::ExpandedData expandedDataInput;
\r
338 expandedDataInput.dataExpanded = &expandedDataInput.dataExpandedIn[0];
\r
339 for (int m = 0; m < BlockFloatCompander::k_numRB; ++m)
\r
341 auto shiftVal = randExpShift(gen);
\r
342 for (int n = 0; n < BlockFloatCompander::k_numREReal; ++n)
\r
344 expandedDataInput.dataExpanded[m*BlockFloatCompander::k_numREReal+n] = int16_t(randInt16(gen) >> shiftVal);
\r
348 BlockFloatCompander::CompressedData compressedDataRef;
\r
349 compressedDataRef.dataCompressed = &compressedDataRef.dataCompressedDataOut[0];
\r
350 BlockFloatCompander::ExpandedData expandedDataRef;
\r
351 expandedDataRef.dataExpanded = &expandedDataRef.dataExpandedIn[0];
\r
352 BlockFloatCompander::CompressedData compressedDataKern;
\r
353 compressedDataKern.dataCompressed = &compressedDataKern.dataCompressedDataOut[0];
\r
354 BlockFloatCompander::ExpandedData expandedDataKern;
\r
355 expandedDataKern.dataExpanded = &expandedDataKern.dataExpandedIn[0];
\r
357 //std::cout << "Verifying AVX512 8bit Kernel\n";
\r
358 expandedDataInput.iqWidth = 8;
\r
359 // Generate reference
\r
360 BlockFloatCompander::BlockFloatCompress_Basic(expandedDataInput, &compressedDataRef);
\r
361 BlockFloatCompander::BlockFloatExpand_Basic(compressedDataRef, &expandedDataRef);
\r
362 // Generate kernel output
\r
363 BlockFloatCompander::BlockFloatCompress_8b_AVX512(expandedDataInput, &compressedDataKern);
\r
364 BlockFloatCompander::BlockFloatExpand_8b_AVX512(compressedDataRef, &expandedDataKern);
\r
366 auto totNumBytes = ((3 * compressedDataRef.iqWidth) + 1) * BlockFloatCompander::k_numRB;
\r
367 //std::cout << "Compression: ";
\r
368 resSum += checkData(compressedDataRef.dataCompressed, compressedDataKern.dataCompressed, totNumBytes);
\r
369 //std::cout << "Expansion: ";
\r
370 resSum += checkData(expandedDataRef.dataExpanded, expandedDataKern.dataExpanded, BlockFloatCompander::k_numSampsExpanded);
\r
372 ASSERT_EQ(0, resSum);
\r
375 TEST_P(BfpPerf, AVX512_8bit_compression)
\r
379 // Create random number generator
\r
380 std::random_device rd;
\r
381 std::mt19937 gen(rd()); //Standard mersenne_twister_engine seeded with rd()
\r
382 std::uniform_int_distribution<int16_t> randInt16(-32768, 32767);
\r
383 std::uniform_int_distribution<int> randExpShift(0, 4);
\r
385 // Generate random test data for compression kernel
\r
386 BlockFloatCompander::ExpandedData expandedDataInput;
\r
387 expandedDataInput.dataExpanded = &expandedDataInput.dataExpandedIn[0];
\r
388 for (int m = 0; m < BlockFloatCompander::k_numRB; ++m)
\r
390 auto shiftVal = randExpShift(gen);
\r
391 for (int n = 0; n < BlockFloatCompander::k_numREReal; ++n)
\r
393 expandedDataInput.dataExpanded[m*BlockFloatCompander::k_numREReal+n] = int16_t(randInt16(gen) >> shiftVal);
\r
397 BlockFloatCompander::CompressedData compressedDataRef;
\r
398 compressedDataRef.dataCompressed = &compressedDataRef.dataCompressedDataOut[0];
\r
399 BlockFloatCompander::ExpandedData expandedDataRef;
\r
400 expandedDataRef.dataExpanded = &expandedDataRef.dataExpandedIn[0];
\r
401 BlockFloatCompander::CompressedData compressedDataKern;
\r
402 compressedDataKern.dataCompressed = &compressedDataKern.dataCompressedDataOut[0];
\r
403 BlockFloatCompander::ExpandedData expandedDataKern;
\r
404 expandedDataKern.dataExpanded = &expandedDataKern.dataExpandedIn[0];
\r
406 //std::cout << "Verifying AVX512 8bit Kernel\n";
\r
407 expandedDataInput.iqWidth = 8;
\r
408 // Generate reference
\r
409 BlockFloatCompander::BlockFloatCompress_Basic(expandedDataInput, &compressedDataRef);
\r
410 BlockFloatCompander::BlockFloatExpand_Basic(compressedDataRef, &expandedDataRef);
\r
411 // Generate kernel output
\r
412 BlockFloatCompander::BlockFloatCompress_8b_AVX512(expandedDataInput, &compressedDataKern);
\r
413 BlockFloatCompander::BlockFloatExpand_8b_AVX512(compressedDataRef, &expandedDataKern);
\r
415 auto totNumBytes = ((3 * compressedDataRef.iqWidth) + 1) * BlockFloatCompander::k_numRB;
\r
416 //std::cout << "Compression: ";
\r
417 resSum += checkData(compressedDataRef.dataCompressed, compressedDataKern.dataCompressed, totNumBytes);
\r
418 //std::cout << "Expansion: ";
\r
419 resSum += checkData(expandedDataRef.dataExpanded, expandedDataKern.dataExpanded, BlockFloatCompander::k_numSampsExpanded);
\r
421 ASSERT_EQ(0, resSum);
\r
423 performance("AVX512", module_name, BlockFloatCompander::BlockFloatCompress_8b_AVX512, expandedDataInput, &compressedDataKern);
\r
426 TEST_P(BfpPerf, AVX512_8bit_decompression)
\r
430 // Create random number generator
\r
431 std::random_device rd;
\r
432 std::mt19937 gen(rd()); //Standard mersenne_twister_engine seeded with rd()
\r
433 std::uniform_int_distribution<int16_t> randInt16(-32768, 32767);
\r
434 std::uniform_int_distribution<int> randExpShift(0, 4);
\r
436 // Generate random test data for compression kernel
\r
437 BlockFloatCompander::ExpandedData expandedDataInput;
\r
438 expandedDataInput.dataExpanded = &expandedDataInput.dataExpandedIn[0];
\r
439 for (int m = 0; m < BlockFloatCompander::k_numRB; ++m)
\r
441 auto shiftVal = randExpShift(gen);
\r
442 for (int n = 0; n < BlockFloatCompander::k_numREReal; ++n)
\r
444 expandedDataInput.dataExpanded[m*BlockFloatCompander::k_numREReal+n] = int16_t(randInt16(gen) >> shiftVal);
\r
448 BlockFloatCompander::CompressedData compressedDataRef;
\r
449 compressedDataRef.dataCompressed = &compressedDataRef.dataCompressedDataOut[0];
\r
450 BlockFloatCompander::ExpandedData expandedDataRef;
\r
451 expandedDataRef.dataExpanded = &expandedDataRef.dataExpandedIn[0];
\r
452 BlockFloatCompander::CompressedData compressedDataKern;
\r
453 compressedDataKern.dataCompressed = &compressedDataKern.dataCompressedDataOut[0];
\r
454 BlockFloatCompander::ExpandedData expandedDataKern;
\r
455 expandedDataKern.dataExpanded = &expandedDataKern.dataExpandedIn[0];
\r
457 //std::cout << "Verifying AVX512 8bit Kernel\n";
\r
458 expandedDataInput.iqWidth = 8;
\r
459 // Generate reference
\r
460 BlockFloatCompander::BlockFloatCompress_Basic(expandedDataInput, &compressedDataRef);
\r
461 BlockFloatCompander::BlockFloatExpand_Basic(compressedDataRef, &expandedDataRef);
\r
462 // Generate kernel output
\r
463 BlockFloatCompander::BlockFloatCompress_8b_AVX512(expandedDataInput, &compressedDataKern);
\r
464 BlockFloatCompander::BlockFloatExpand_8b_AVX512(compressedDataRef, &expandedDataKern);
\r
466 auto totNumBytes = ((3 * compressedDataRef.iqWidth) + 1) * BlockFloatCompander::k_numRB;
\r
467 //std::cout << "Compression: ";
\r
468 resSum += checkData(compressedDataRef.dataCompressed, compressedDataKern.dataCompressed, totNumBytes);
\r
469 //std::cout << "Expansion: ";
\r
470 resSum += checkData(expandedDataRef.dataExpanded, expandedDataKern.dataExpanded, BlockFloatCompander::k_numSampsExpanded);
\r
472 ASSERT_EQ(0, resSum);
\r
474 performance("AVX512", module_name, BlockFloatCompander::BlockFloatExpand_8b_AVX512, compressedDataRef, &expandedDataKern);
\r
479 TEST_P(BfpPerf, AVX512_9bit_compression)
\r
483 // Create random number generator
\r
484 std::random_device rd;
\r
485 std::mt19937 gen(rd()); //Standard mersenne_twister_engine seeded with rd()
\r
486 std::uniform_int_distribution<int16_t> randInt16(-32768, 32767);
\r
487 std::uniform_int_distribution<int> randExpShift(0, 4);
\r
489 // Generate random test data for compression kernel
\r
490 BlockFloatCompander::ExpandedData expandedDataInput;
\r
491 expandedDataInput.dataExpanded = &expandedDataInput.dataExpandedIn[0];
\r
492 for (int m = 0; m < BlockFloatCompander::k_numRB; ++m)
\r
494 auto shiftVal = randExpShift(gen);
\r
495 for (int n = 0; n < BlockFloatCompander::k_numREReal; ++n)
\r
497 expandedDataInput.dataExpanded[m*BlockFloatCompander::k_numREReal+n] = int16_t(randInt16(gen) >> shiftVal);
\r
501 BlockFloatCompander::CompressedData compressedDataRef;
\r
502 compressedDataRef.dataCompressed = &compressedDataRef.dataCompressedDataOut[0];
\r
503 BlockFloatCompander::ExpandedData expandedDataRef;
\r
504 expandedDataRef.dataExpanded = &expandedDataRef.dataExpandedIn[0];
\r
505 BlockFloatCompander::CompressedData compressedDataKern;
\r
506 compressedDataKern.dataCompressed = &compressedDataKern.dataCompressedDataOut[0];
\r
507 BlockFloatCompander::ExpandedData expandedDataKern;
\r
508 expandedDataKern.dataExpanded = &expandedDataKern.dataExpandedIn[0];
\r
510 //std::cout << "Verifying AVX512 8bit Kernel\n";
\r
511 expandedDataInput.iqWidth = 9;
\r
512 // Generate reference
\r
513 BlockFloatCompander::BlockFloatCompress_Basic(expandedDataInput, &compressedDataRef);
\r
514 BlockFloatCompander::BlockFloatExpand_Basic(compressedDataRef, &expandedDataRef);
\r
515 // Generate kernel output
\r
516 BlockFloatCompander::BlockFloatCompress_9b_AVX512(expandedDataInput, &compressedDataKern);
\r
517 BlockFloatCompander::BlockFloatExpand_9b_AVX512(compressedDataRef, &expandedDataKern);
\r
519 auto totNumBytes = ((3 * compressedDataRef.iqWidth) + 1) * BlockFloatCompander::k_numRB;
\r
520 //std::cout << "Compression: ";
\r
521 resSum += checkData(compressedDataRef.dataCompressed, compressedDataKern.dataCompressed, totNumBytes);
\r
522 //std::cout << "Expansion: ";
\r
523 resSum += checkData(expandedDataRef.dataExpanded, expandedDataKern.dataExpanded, BlockFloatCompander::k_numSampsExpanded);
\r
525 ASSERT_EQ(0, resSum);
\r
527 performance("AVX512", module_name, BlockFloatCompander::BlockFloatCompress_9b_AVX512, expandedDataInput, &compressedDataKern);
\r
531 TEST_P(BfpPerf, AVX512_9bit_decompression)
\r
535 // Create random number generator
\r
536 std::random_device rd;
\r
537 std::mt19937 gen(rd()); //Standard mersenne_twister_engine seeded with rd()
\r
538 std::uniform_int_distribution<int16_t> randInt16(-32768, 32767);
\r
539 std::uniform_int_distribution<int> randExpShift(0, 4);
\r
541 // Generate random test data for compression kernel
\r
542 BlockFloatCompander::ExpandedData expandedDataInput;
\r
543 expandedDataInput.dataExpanded = &expandedDataInput.dataExpandedIn[0];
\r
544 for (int m = 0; m < BlockFloatCompander::k_numRB; ++m)
\r
546 auto shiftVal = randExpShift(gen);
\r
547 for (int n = 0; n < BlockFloatCompander::k_numREReal; ++n)
\r
549 expandedDataInput.dataExpanded[m*BlockFloatCompander::k_numREReal+n] = int16_t(randInt16(gen) >> shiftVal);
\r
553 BlockFloatCompander::CompressedData compressedDataRef;
\r
554 compressedDataRef.dataCompressed = &compressedDataRef.dataCompressedDataOut[0];
\r
555 BlockFloatCompander::ExpandedData expandedDataRef;
\r
556 expandedDataRef.dataExpanded = &expandedDataRef.dataExpandedIn[0];
\r
557 BlockFloatCompander::CompressedData compressedDataKern;
\r
558 compressedDataKern.dataCompressed = &compressedDataKern.dataCompressedDataOut[0];
\r
559 BlockFloatCompander::ExpandedData expandedDataKern;
\r
560 expandedDataKern.dataExpanded = &expandedDataKern.dataExpandedIn[0];
\r
562 //std::cout << "Verifying AVX512 8bit Kernel\n";
\r
563 expandedDataInput.iqWidth = 9;
\r
564 // Generate reference
\r
565 BlockFloatCompander::BlockFloatCompress_Basic(expandedDataInput, &compressedDataRef);
\r
566 BlockFloatCompander::BlockFloatExpand_Basic(compressedDataRef, &expandedDataRef);
\r
567 // Generate kernel output
\r
568 BlockFloatCompander::BlockFloatCompress_9b_AVX512(expandedDataInput, &compressedDataKern);
\r
569 BlockFloatCompander::BlockFloatExpand_9b_AVX512(compressedDataRef, &expandedDataKern);
\r
571 auto totNumBytes = ((3 * compressedDataRef.iqWidth) + 1) * BlockFloatCompander::k_numRB;
\r
572 //std::cout << "Compression: ";
\r
573 resSum += checkData(compressedDataRef.dataCompressed, compressedDataKern.dataCompressed, totNumBytes);
\r
574 //std::cout << "Expansion: ";
\r
575 resSum += checkData(expandedDataRef.dataExpanded, expandedDataKern.dataExpanded, BlockFloatCompander::k_numSampsExpanded);
\r
577 ASSERT_EQ(0, resSum);
\r
579 performance("AVX512", module_name, BlockFloatCompander::BlockFloatExpand_9b_AVX512, compressedDataRef, &expandedDataKern);
\r
583 TEST_P(BfpPerf, AVX512_10bit_compression)
\r
587 // Create random number generator
\r
588 std::random_device rd;
\r
589 std::mt19937 gen(rd()); //Standard mersenne_twister_engine seeded with rd()
\r
590 std::uniform_int_distribution<int16_t> randInt16(-32768, 32767);
\r
591 std::uniform_int_distribution<int> randExpShift(0, 4);
\r
593 // Generate random test data for compression kernel
\r
594 BlockFloatCompander::ExpandedData expandedDataInput;
\r
595 expandedDataInput.dataExpanded = &expandedDataInput.dataExpandedIn[0];
\r
596 for (int m = 0; m < BlockFloatCompander::k_numRB; ++m)
\r
598 auto shiftVal = randExpShift(gen);
\r
599 for (int n = 0; n < BlockFloatCompander::k_numREReal; ++n)
\r
601 expandedDataInput.dataExpanded[m*BlockFloatCompander::k_numREReal+n] = int16_t(randInt16(gen) >> shiftVal);
\r
605 BlockFloatCompander::CompressedData compressedDataRef;
\r
606 compressedDataRef.dataCompressed = &compressedDataRef.dataCompressedDataOut[0];
\r
607 BlockFloatCompander::ExpandedData expandedDataRef;
\r
608 expandedDataRef.dataExpanded = &expandedDataRef.dataExpandedIn[0];
\r
609 BlockFloatCompander::CompressedData compressedDataKern;
\r
610 compressedDataKern.dataCompressed = &compressedDataKern.dataCompressedDataOut[0];
\r
611 BlockFloatCompander::ExpandedData expandedDataKern;
\r
612 expandedDataKern.dataExpanded = &expandedDataKern.dataExpandedIn[0];
\r
614 //std::cout << "Verifying AVX512 8bit Kernel\n";
\r
615 expandedDataInput.iqWidth = 10;
\r
616 // Generate reference
\r
617 BlockFloatCompander::BlockFloatCompress_Basic(expandedDataInput, &compressedDataRef);
\r
618 BlockFloatCompander::BlockFloatExpand_Basic(compressedDataRef, &expandedDataRef);
\r
619 // Generate kernel output
\r
620 BlockFloatCompander::BlockFloatCompress_10b_AVX512(expandedDataInput, &compressedDataKern);
\r
621 BlockFloatCompander::BlockFloatExpand_10b_AVX512(compressedDataRef, &expandedDataKern);
\r
623 auto totNumBytes = ((3 * compressedDataRef.iqWidth) + 1) * BlockFloatCompander::k_numRB;
\r
624 //std::cout << "Compression: ";
\r
625 resSum += checkData(compressedDataRef.dataCompressed, compressedDataKern.dataCompressed, totNumBytes);
\r
626 //std::cout << "Expansion: ";
\r
627 resSum += checkData(expandedDataRef.dataExpanded, expandedDataKern.dataExpanded, BlockFloatCompander::k_numSampsExpanded);
\r
629 ASSERT_EQ(0, resSum);
\r
631 performance("AVX512", module_name, BlockFloatCompander::BlockFloatCompress_10b_AVX512, expandedDataInput, &compressedDataKern);
\r
634 TEST_P(BfpPerf, AVX512_10bit_decompression)
\r
638 // Create random number generator
\r
639 std::random_device rd;
\r
640 std::mt19937 gen(rd()); //Standard mersenne_twister_engine seeded with rd()
\r
641 std::uniform_int_distribution<int16_t> randInt16(-32768, 32767);
\r
642 std::uniform_int_distribution<int> randExpShift(0, 4);
\r
644 // Generate random test data for compression kernel
\r
645 BlockFloatCompander::ExpandedData expandedDataInput;
\r
646 expandedDataInput.dataExpanded = &expandedDataInput.dataExpandedIn[0];
\r
647 for (int m = 0; m < BlockFloatCompander::k_numRB; ++m)
\r
649 auto shiftVal = randExpShift(gen);
\r
650 for (int n = 0; n < BlockFloatCompander::k_numREReal; ++n)
\r
652 expandedDataInput.dataExpanded[m*BlockFloatCompander::k_numREReal+n] = int16_t(randInt16(gen) >> shiftVal);
\r
656 BlockFloatCompander::CompressedData compressedDataRef;
\r
657 compressedDataRef.dataCompressed = &compressedDataRef.dataCompressedDataOut[0];
\r
658 BlockFloatCompander::ExpandedData expandedDataRef;
\r
659 expandedDataRef.dataExpanded = &expandedDataRef.dataExpandedIn[0];
\r
660 BlockFloatCompander::CompressedData compressedDataKern;
\r
661 compressedDataKern.dataCompressed = &compressedDataKern.dataCompressedDataOut[0];
\r
662 BlockFloatCompander::ExpandedData expandedDataKern;
\r
663 expandedDataKern.dataExpanded = &expandedDataKern.dataExpandedIn[0];
\r
665 //std::cout << "Verifying AVX512 8bit Kernel\n";
\r
666 expandedDataInput.iqWidth = 10;
\r
667 // Generate reference
\r
668 BlockFloatCompander::BlockFloatCompress_Basic(expandedDataInput, &compressedDataRef);
\r
669 BlockFloatCompander::BlockFloatExpand_Basic(compressedDataRef, &expandedDataRef);
\r
670 // Generate kernel output
\r
671 BlockFloatCompander::BlockFloatCompress_10b_AVX512(expandedDataInput, &compressedDataKern);
\r
672 BlockFloatCompander::BlockFloatExpand_10b_AVX512(compressedDataRef, &expandedDataKern);
\r
674 auto totNumBytes = ((3 * compressedDataRef.iqWidth) + 1) * BlockFloatCompander::k_numRB;
\r
675 //std::cout << "Compression: ";
\r
676 resSum += checkData(compressedDataRef.dataCompressed, compressedDataKern.dataCompressed, totNumBytes);
\r
677 //std::cout << "Expansion: ";
\r
678 resSum += checkData(expandedDataRef.dataExpanded, expandedDataKern.dataExpanded, BlockFloatCompander::k_numSampsExpanded);
\r
680 ASSERT_EQ(0, resSum);
\r
682 performance("AVX512", module_name, BlockFloatCompander::BlockFloatExpand_10b_AVX512, compressedDataRef, &expandedDataKern);
\r
685 TEST_P(BfpPerf, AVX512_12bit_compression)
\r
689 // Create random number generator
\r
690 std::random_device rd;
\r
691 std::mt19937 gen(rd()); //Standard mersenne_twister_engine seeded with rd()
\r
692 std::uniform_int_distribution<int16_t> randInt16(-32768, 32767);
\r
693 std::uniform_int_distribution<int> randExpShift(0, 4);
\r
695 // Generate random test data for compression kernel
\r
696 BlockFloatCompander::ExpandedData expandedDataInput;
\r
697 expandedDataInput.dataExpanded = &expandedDataInput.dataExpandedIn[0];
\r
698 for (int m = 0; m < BlockFloatCompander::k_numRB; ++m)
\r
700 auto shiftVal = randExpShift(gen);
\r
701 for (int n = 0; n < BlockFloatCompander::k_numREReal; ++n)
\r
703 expandedDataInput.dataExpanded[m*BlockFloatCompander::k_numREReal+n] = int16_t(randInt16(gen) >> shiftVal);
\r
707 BlockFloatCompander::CompressedData compressedDataRef;
\r
708 compressedDataRef.dataCompressed = &compressedDataRef.dataCompressedDataOut[0];
\r
709 BlockFloatCompander::ExpandedData expandedDataRef;
\r
710 expandedDataRef.dataExpanded = &expandedDataRef.dataExpandedIn[0];
\r
711 BlockFloatCompander::CompressedData compressedDataKern;
\r
712 compressedDataKern.dataCompressed = &compressedDataKern.dataCompressedDataOut[0];
\r
713 BlockFloatCompander::ExpandedData expandedDataKern;
\r
714 expandedDataKern.dataExpanded = &expandedDataKern.dataExpandedIn[0];
\r
716 //std::cout << "Verifying AVX512 8bit Kernel\n";
\r
717 expandedDataInput.iqWidth = 12;
\r
718 // Generate reference
\r
719 BlockFloatCompander::BlockFloatCompress_Basic(expandedDataInput, &compressedDataRef);
\r
720 BlockFloatCompander::BlockFloatExpand_Basic(compressedDataRef, &expandedDataRef);
\r
721 // Generate kernel output
\r
722 BlockFloatCompander::BlockFloatCompress_12b_AVX512(expandedDataInput, &compressedDataKern);
\r
723 BlockFloatCompander::BlockFloatExpand_12b_AVX512(compressedDataRef, &expandedDataKern);
\r
725 auto totNumBytes = ((3 * compressedDataRef.iqWidth) + 1) * BlockFloatCompander::k_numRB;
\r
726 //std::cout << "Compression: ";
\r
727 resSum += checkData(compressedDataRef.dataCompressed, compressedDataKern.dataCompressed, totNumBytes);
\r
728 //std::cout << "Expansion: ";
\r
729 resSum += checkData(expandedDataRef.dataExpanded, expandedDataKern.dataExpanded, BlockFloatCompander::k_numSampsExpanded);
\r
731 ASSERT_EQ(0, resSum);
\r
733 performance("AVX512", module_name, BlockFloatCompander::BlockFloatCompress_12b_AVX512, expandedDataInput, &compressedDataKern);
\r
737 TEST_P(BfpPerf, AVX512_12bit_decompression)
\r
741 // Create random number generator
\r
742 std::random_device rd;
\r
743 std::mt19937 gen(rd()); //Standard mersenne_twister_engine seeded with rd()
\r
744 std::uniform_int_distribution<int16_t> randInt16(-32768, 32767);
\r
745 std::uniform_int_distribution<int> randExpShift(0, 4);
\r
747 // Generate random test data for compression kernel
\r
748 BlockFloatCompander::ExpandedData expandedDataInput;
\r
749 expandedDataInput.dataExpanded = &expandedDataInput.dataExpandedIn[0];
\r
750 for (int m = 0; m < BlockFloatCompander::k_numRB; ++m)
\r
752 auto shiftVal = randExpShift(gen);
\r
753 for (int n = 0; n < BlockFloatCompander::k_numREReal; ++n)
\r
755 expandedDataInput.dataExpanded[m*BlockFloatCompander::k_numREReal+n] = int16_t(randInt16(gen) >> shiftVal);
\r
759 BlockFloatCompander::CompressedData compressedDataRef;
\r
760 compressedDataRef.dataCompressed = &compressedDataRef.dataCompressedDataOut[0];
\r
761 BlockFloatCompander::ExpandedData expandedDataRef;
\r
762 expandedDataRef.dataExpanded = &expandedDataRef.dataExpandedIn[0];
\r
763 BlockFloatCompander::CompressedData compressedDataKern;
\r
764 compressedDataKern.dataCompressed = &compressedDataKern.dataCompressedDataOut[0];
\r
765 BlockFloatCompander::ExpandedData expandedDataKern;
\r
766 expandedDataKern.dataExpanded = &expandedDataKern.dataExpandedIn[0];
\r
768 //std::cout << "Verifying AVX512 8bit Kernel\n";
\r
769 expandedDataInput.iqWidth = 12;
\r
770 // Generate reference
\r
771 BlockFloatCompander::BlockFloatCompress_Basic(expandedDataInput, &compressedDataRef);
\r
772 BlockFloatCompander::BlockFloatExpand_Basic(compressedDataRef, &expandedDataRef);
\r
773 // Generate kernel output
\r
774 BlockFloatCompander::BlockFloatCompress_12b_AVX512(expandedDataInput, &compressedDataKern);
\r
775 BlockFloatCompander::BlockFloatExpand_12b_AVX512(compressedDataRef, &expandedDataKern);
\r
777 auto totNumBytes = ((3 * compressedDataRef.iqWidth) + 1) * BlockFloatCompander::k_numRB;
\r
778 //std::cout << "Compression: ";
\r
779 resSum += checkData(compressedDataRef.dataCompressed, compressedDataKern.dataCompressed, totNumBytes);
\r
780 //std::cout << "Expansion: ";
\r
781 resSum += checkData(expandedDataRef.dataExpanded, expandedDataKern.dataExpanded, BlockFloatCompander::k_numSampsExpanded);
\r
783 ASSERT_EQ(0, resSum);
\r
785 performance("AVX512", module_name, BlockFloatCompander::BlockFloatExpand_12b_AVX512, compressedDataRef, &expandedDataKern);
\r
788 TEST_P(BfpCheck, AVX512_sweep_xranlib)
\r
790 int32_t resSum = 0;
\r
793 int16_t compMethod = XRAN_COMPMETHOD_BLKFLOAT;
\r
794 int16_t iqWidth[] = {8, 9, 10, 12};
\r
796 int16_t numRBs[] = {16, 18, 32, 36, 48, 70, 113, 273};
\r
797 struct xranlib_decompress_request bfp_decom_req;
\r
798 struct xranlib_decompress_response bfp_decom_rsp;
\r
800 struct xranlib_compress_request bfp_com_req;
\r
801 struct xranlib_compress_response bfp_com_rsp;
\r
803 // Create random number generator
\r
804 std::random_device rd;
\r
805 std::mt19937 gen(rd()); //Standard mersenne_twister_engine seeded with rd()
\r
806 std::uniform_int_distribution<int16_t> randInt16(-32768, 32767);
\r
807 std::uniform_int_distribution<int> randExpShift(0, 4);
\r
809 BlockFloatCompander::ExpandedData expandedData;
\r
810 expandedData.dataExpanded = &loc_dataExpandedIn[0];
\r
811 BlockFloatCompander::ExpandedData expandedDataRes;
\r
812 expandedDataRes.dataExpanded = &loc_dataExpandedRes[0];
\r
813 for (int iq_w_id = 0; iq_w_id < sizeof(iqWidth)/sizeof(iqWidth[0]); iq_w_id ++){
\r
814 for (int tc = 0; tc < sizeof(numRBs)/sizeof(numRBs[0]); tc ++){
\r
816 //printf("[%d]numRBs %d [%d] iqWidth %d\n",tc, numRBs[tc], iq_w_id, iqWidth[iq_w_id]);
\r
817 // Generate random test data for compression kernel
\r
819 for (int m = 0; m < 18*BlockFloatCompander::k_numRB; ++m) {
\r
820 auto shiftVal = randExpShift(gen);
\r
821 for (int n = 0; n < BlockFloatCompander::k_numREReal; ++n) {
\r
822 expandedData.dataExpanded[m*BlockFloatCompander::k_numREReal+n] = int16_t(randInt16(gen) >> shiftVal);
\r
826 BlockFloatCompander::CompressedData compressedData;
\r
827 compressedData.dataCompressed = &loc_dataCompressedDataOut[0];
\r
829 std::memset(&loc_dataCompressedDataOut[0], 0, 288*BlockFloatCompander::k_numREReal);
\r
830 std::memset(&loc_dataExpandedRes[0], 0, 288*BlockFloatCompander::k_numREReal);
\r
832 std::memset(&bfp_com_req, 0, sizeof(struct xranlib_compress_request));
\r
833 std::memset(&bfp_com_rsp, 0, sizeof(struct xranlib_compress_response));
\r
834 std::memset(&bfp_decom_req, 0, sizeof(struct xranlib_decompress_request));
\r
835 std::memset(&bfp_decom_rsp, 0, sizeof(struct xranlib_decompress_response));
\r
837 bfp_com_req.data_in = (int16_t *)expandedData.dataExpanded;
\r
838 bfp_com_req.numRBs = numRBs[tc];
\r
839 bfp_com_req.len = numRBs[tc]*12*2*2;
\r
840 bfp_com_req.compMethod = compMethod;
\r
841 bfp_com_req.iqWidth = iqWidth[iq_w_id];
\r
843 bfp_com_rsp.data_out = (int8_t *)(compressedData.dataCompressed);
\r
844 bfp_com_rsp.len = 0;
\r
846 xranlib_compress_avx512(&bfp_com_req, &bfp_com_rsp);
\r
848 bfp_decom_req.data_in = (int8_t *)(compressedData.dataCompressed);
\r
849 bfp_decom_req.numRBs = numRBs[tc];
\r
850 bfp_decom_req.len = bfp_com_rsp.len;
\r
851 bfp_decom_req.compMethod = compMethod;
\r
852 bfp_decom_req.iqWidth = iqWidth[iq_w_id];
\r
854 bfp_decom_rsp.data_out = (int16_t *)expandedDataRes.dataExpanded;
\r
855 bfp_decom_rsp.len = 0;
\r
857 xranlib_decompress_avx512(&bfp_decom_req, &bfp_decom_rsp);
\r
859 resSum += checkDataApprox(expandedData.dataExpanded, expandedDataRes.dataExpanded, numRBs[tc]*BlockFloatCompander::k_numREReal);
\r
861 ASSERT_EQ(numRBs[tc]*12*2*2, bfp_decom_rsp.len);
\r
862 ASSERT_EQ(0, resSum);
\r
867 TEST_P(BfpPerfEx, AVX512_Comp)
\r
869 performance("AVX512", module_name, xranlib_compress_avx512, &bfp_com_req, &bfp_com_rsp);
\r
872 TEST_P(BfpPerfEx, AVX512_DeComp)
\r
874 performance("AVX512", module_name, xranlib_decompress_avx512, &bfp_decom_req, &bfp_decom_rsp);
\r
877 INSTANTIATE_TEST_CASE_P(UnitTest, BfpCheck,
\r
878 testing::ValuesIn(get_sequence(BfpCheck::get_number_of_cases("bfp_functional"))));
\r
880 INSTANTIATE_TEST_CASE_P(UnitTest, BfpPerf,
\r
881 testing::ValuesIn(get_sequence(BfpPerf::get_number_of_cases("bfp_performace"))));
\r
884 INSTANTIATE_TEST_CASE_P(UnitTest, BfpPerfEx,
\r
885 testing::ValuesIn(get_sequence(BfpPerf::get_number_of_cases("bfp_performace_ex"))));
\r