JFConversion: Simplify (processing per module, not per packet) + add GPU conversion procedure - currently only synchronous

This commit is contained in:
2023-06-07 20:49:35 +02:00
parent 6a50092800
commit b5d0b34fc8
15 changed files with 404 additions and 281 deletions
+120 -9
View File
@@ -5,6 +5,7 @@
#include "../tests/FPGAUnitTest.h"
#include "../jungfrau/JFConversionFloatingPoint.h"
#include "../jungfrau/JFConversionGPU.h"
#include "../jungfrau/JFConversionFixedPoint.h"
void SetupPedestal( JFModulePedestal &pedestal_g0, JFModulePedestal &pedestal_g1, JFModulePedestal &pedestal_g2) {
@@ -41,7 +42,7 @@ TEST_CASE("JFConversionFloatingPoint_G0","[JFConversion]") {
input[i] = i % 16384;
for (int i = 0; i < 128; i++)
conv.Convert(output_16bit.data(), input.data());
conv.ConvertModule(output_16bit.data(), input.data());
conv.ConvertFP(output_fp.data(), input.data());
auto err = Compare(output_16bit.data(), output_fp, RAW_MODULE_SIZE);
@@ -76,7 +77,7 @@ TEST_CASE("JFConversionFixedPoint_G0","[JFConversion]") {
for (int i = 0; i < RAW_MODULE_SIZE; i++)
input[i] = i % 16384;
conv.Convert(output_16bit.data(), input.data());
conv.ConvertModule(output_16bit.data(), input.data());
conv_fp.ConvertFP(output_fp.data(), input.data());
auto err = Compare(output_16bit.data(), output_fp, RAW_MODULE_SIZE);
@@ -88,6 +89,42 @@ TEST_CASE("JFConversionFixedPoint_G0","[JFConversion]") {
}
}
TEST_CASE("JFConversionGPU_G0","[JFConversion]") {
JFConversionGPU conv;
JFConversionFloatingPoint conv_fp;
JFModulePedestal pedestal_g0;
JFModulePedestal pedestal_g1;
JFModulePedestal pedestal_g2;
SetupPedestal(pedestal_g0, pedestal_g1, pedestal_g2);
JFModuleGainCalibration gain;
std::vector<double> energy{4.0, 6.0, 12.4, 25.0};
for (auto &e: energy) {
conv.Setup(gain, pedestal_g0, pedestal_g1, pedestal_g2, e);
conv_fp.Setup(gain, pedestal_g0, pedestal_g1, pedestal_g2, e);
std::vector<uint16_t> input(RAW_MODULE_SIZE);
std::vector<float> output_fp(RAW_MODULE_SIZE);
std::vector<int16_t> output_16bit(RAW_MODULE_SIZE);
for (int i = 0; i < RAW_MODULE_SIZE; i++)
input[i] = i % 16384;
conv.ConvertModule(output_16bit.data(), input.data());
conv_fp.ConvertFP(output_fp.data(), input.data());
conv.Sync();
auto err = Compare(output_16bit.data(), output_fp, RAW_MODULE_SIZE);
auto max_err = MaxErrorOnConversion(output_16bit.data(), output_fp, RAW_MODULE_SIZE);
std::cout << "Error on conversion " << err << " max error " << max_err << std::endl;
REQUIRE(err < 0.5);
REQUIRE(max_err <= 1.0);
}
}
TEST_CASE("JFConversionFixedPoint_G0_TestFile","[JFConversion]") {
JFConversionFixedPoint conv;
JFConversionFloatingPoint conv_fp;
@@ -112,7 +149,7 @@ TEST_CASE("JFConversionFixedPoint_G0_TestFile","[JFConversion]") {
for (int i = 0; i < RAW_MODULE_SIZE; i++)
input[i] = i % 16384;
conv.Convert(output_16bit.data(), input.data());
conv.ConvertModule(output_16bit.data(), input.data());
conv_fp.ConvertFP(output_fp.data(), input.data());
auto err = Compare(output_16bit.data(), output_fp, RAW_MODULE_SIZE);
@@ -144,7 +181,7 @@ TEST_CASE("JFConversionFloatingPoint_G1","[JFConversion]") {
for (int i = 0; i < RAW_MODULE_SIZE; i++)
input[i] = (i % 16384) | 0x4000;
conv.Convert(output_16bit.data(), input.data());
conv.ConvertModule(output_16bit.data(), input.data());
conv.ConvertFP(output_fp.data(), input.data());
auto err = Compare(output_16bit.data(), output_fp, RAW_MODULE_SIZE);
@@ -179,7 +216,7 @@ TEST_CASE("JFConversionFixedPoint_G1","[JFConversion]") {
for (int i = 0; i < RAW_MODULE_SIZE; i++)
input[i] = (i % 16384) | 0x4000;
conv.Convert(output_16bit.data(), input.data());
conv.ConvertModule(output_16bit.data(), input.data());
conv_fp.ConvertFP(output_fp.data(), input.data());
auto err = Compare(output_16bit.data(), output_fp, RAW_MODULE_SIZE);
@@ -191,6 +228,43 @@ TEST_CASE("JFConversionFixedPoint_G1","[JFConversion]") {
}
}
TEST_CASE("JFConversionGPU_G1","[JFConversion]") {
JFConversionGPU conv;
JFConversionFloatingPoint conv_fp;
JFModulePedestal pedestal_g0;
JFModulePedestal pedestal_g1;
JFModulePedestal pedestal_g2;
SetupPedestal(pedestal_g0, pedestal_g1, pedestal_g2);
JFModuleGainCalibration gain;
std::vector<double> energy{4.0, 6.0, 12.4, 25.0};
for (auto &e: energy) {
conv.Setup(gain, pedestal_g0, pedestal_g1, pedestal_g2, e);
conv_fp.Setup(gain, pedestal_g0, pedestal_g1, pedestal_g2, e);
std::vector<uint16_t> input(RAW_MODULE_SIZE);
std::vector<float> output_fp(RAW_MODULE_SIZE);
std::vector<int16_t> output_16bit(RAW_MODULE_SIZE);
for (int i = 0; i < RAW_MODULE_SIZE; i++)
input[i] = (i % 16384) | 0x4000;
conv.ConvertModule(output_16bit.data(), input.data());
conv_fp.ConvertFP(output_fp.data(), input.data());
conv.Sync();
auto err = Compare(output_16bit.data(), output_fp, RAW_MODULE_SIZE);
auto max_err = MaxErrorOnConversion(output_16bit.data(), output_fp, RAW_MODULE_SIZE);
std::cout << "Error on conversion " << err << " max error " << max_err << std::endl;
REQUIRE(err < 0.5);
REQUIRE(max_err <= 1.0);
}
}
TEST_CASE("JFConversionFloatingPoint_G2","[JFConversion]") {
JFConversionFloatingPoint conv;
@@ -211,7 +285,7 @@ TEST_CASE("JFConversionFloatingPoint_G2","[JFConversion]") {
for (int i = 0; i < RAW_MODULE_SIZE; i++)
input[i] = (i % 16384) | 0xC000;
conv.Convert(output_16bit.data(), input.data());
conv.ConvertModule(output_16bit.data(), input.data());
conv.ConvertFP(output_fp.data(), input.data());
auto err = Compare(output_16bit.data(), output_fp, RAW_MODULE_SIZE);
@@ -246,7 +320,7 @@ TEST_CASE("JFConversionFixedPoint_G2","[JFConversion]") {
for (int i = 0; i < RAW_MODULE_SIZE; i++)
input[i] = (i % 16384) | 0xC000;
conv.Convert(output_16bit.data(), input.data());
conv.ConvertModule(output_16bit.data(), input.data());
conv_fp.ConvertFP(output_fp.data(), input.data());
auto err = Compare(output_16bit.data(), output_fp, RAW_MODULE_SIZE);
@@ -258,6 +332,43 @@ TEST_CASE("JFConversionFixedPoint_G2","[JFConversion]") {
}
}
TEST_CASE("JFConversionGPU_G2","[JFConversion]") {
JFConversionGPU conv;
JFConversionFloatingPoint conv_fp;
JFModulePedestal pedestal_g0;
JFModulePedestal pedestal_g1;
JFModulePedestal pedestal_g2;
SetupPedestal(pedestal_g0, pedestal_g1, pedestal_g2);
JFModuleGainCalibration gain;
std::vector<double> energy{4.0, 6.0, 12.4, 25.0};
for (auto &e: energy) {
conv.Setup(gain, pedestal_g0, pedestal_g1, pedestal_g2, e);
conv_fp.Setup(gain, pedestal_g0, pedestal_g1, pedestal_g2, e);
std::vector<uint16_t> input(RAW_MODULE_SIZE);
std::vector<float> output_fp(RAW_MODULE_SIZE);
std::vector<int16_t> output_16bit(RAW_MODULE_SIZE);
for (int i = 0; i < RAW_MODULE_SIZE; i++)
input[i] = (i % 16384) | 0xC000;
conv.ConvertModule(output_16bit.data(), input.data());
conv_fp.ConvertFP(output_fp.data(), input.data());
conv.Sync();
auto err = Compare(output_16bit.data(), output_fp, RAW_MODULE_SIZE);
auto max_err = MaxErrorOnConversion(output_16bit.data(), output_fp, RAW_MODULE_SIZE);
std::cout << "Error on conversion " << err << " max error " << max_err << std::endl;
REQUIRE(err < 0.5);
REQUIRE(max_err <= 1.0);
}
}
TEST_CASE("JFConversionFixedPoint_G1_TestFile","[JFConversion]") {
JFConversionFixedPoint conv;
JFConversionFloatingPoint conv_fp;
@@ -282,7 +393,7 @@ TEST_CASE("JFConversionFixedPoint_G1_TestFile","[JFConversion]") {
for (int i = 0; i < RAW_MODULE_SIZE; i++)
input[i] = (i % 16384) | 0x4000;
conv.Convert(output_16bit.data(), input.data());
conv.ConvertModule(output_16bit.data(), input.data());
conv_fp.ConvertFP(output_fp.data(), input.data());
auto err = Compare(output_16bit.data(), output_fp, RAW_MODULE_SIZE);
@@ -318,7 +429,7 @@ TEST_CASE("JFConversionFixedPoint_G2_TestFile","[JFConversion]") {
for (int i = 0; i < RAW_MODULE_SIZE; i++)
input[i] = (i % 16384) | 0xC000;
conv.Convert(output_16bit.data(), input.data());
conv.ConvertModule(output_16bit.data(), input.data());
conv_fp.ConvertFP(output_fp.data(), input.data());
auto err = Compare(output_16bit.data(), output_fp, RAW_MODULE_SIZE);