JFJochReceiver: Use multithreaded implementation for summation of 50+ (assuming 100 microsecond to span thread, it is 0.5% overhead at 25 ms)

This commit is contained in:
2023-05-02 21:17:53 +02:00
parent 60d95dc0d7
commit dffe5ab6b9
3 changed files with 193 additions and 27 deletions
+114
View File
@@ -206,6 +206,120 @@ TEST_CASE("JFJochIntegrationTest_ZMQ_2DataStreams_4Devices", "[JFJochReceiver]")
writer_server->Shutdown();
}
TEST_CASE("JFJochIntegrationTest_ZMQ_2Devices_Summation100", "[JFJochReceiver]") {
Logger logger("JFJochIntegrationTest_ZMQ_2Devices_Summation100");
ZMQContext zmq_context;
RegisterHDF5Filter();
int64_t nimages = 1;
int64_t ndatastream = 2;
int64_t nmodules = 2;
int64_t summation = 100;
JFJochServices services(logger);
JFJochStateMachine state_machine(services, logger);
REQUIRE(!state_machine.GetMeasurementStatistics().has_value());
state_machine.AddDetectorSetup(DetectorGeometry(ndatastream * nmodules, 1, 0, 0, false));
state_machine.NotThreadSafe_Experiment().DataStreams(ndatastream);
state_machine.NotThreadSafe_Experiment().PedestalG0Frames(0).PedestalG1Frames(0).PedestalG2Frames(0);
services.Writer("unix:writer_test", "inproc://#1").Receiver("unix:fpga_receiver_test");
logger.Verbose(true);
std::vector<uint16_t> image(RAW_MODULE_SIZE);
for (int i = 0; i < image.size(); i++)
image[i] = (i*7+i*i*3) % 29;
std::vector<std::unique_ptr<MockAcquisitionDevice>> aq_devices;
for (int i = 0; i < 2; i++) {
auto *test = new MockAcquisitionDevice(i, 512);
aq_devices.emplace_back(test);
}
std::vector<AcquisitionDevice *> tmp_devices;
for (const auto &i: aq_devices)
tmp_devices.emplace_back(i.get());
ZMQImagePusher pusher(zmq_context, {"inproc://#1"});
JFJochReceiverService fpga_receiver(tmp_devices, logger, pusher);
ZMQPreviewPublisher preview(zmq_context, "inproc://#2");
fpga_receiver.PreviewPublisher(&preview);
JFJochWriterService writer(zmq_context, logger);
auto fpga_receiver_server = gRPCServer("unix:fpga_receiver_test", fpga_receiver);
auto writer_server = gRPCServer("unix:writer_test", writer);
REQUIRE_NOTHROW(state_machine.Initialize());
logger.Info("Initialized");
JFJochProtoBuf::DatasetSettings setup;
setup.set_ntrigger(1);
setup.set_images_per_trigger(1);
setup.set_detector_distance_mm(100);
setup.set_file_prefix("integration_test_summation");
setup.set_photon_energy_kev(12.4);
setup.set_data_file_count(2);
setup.set_summation(summation);
REQUIRE_NOTHROW(state_machine.Start(setup));
logger.Info("Started measurement");
JFJochProtoBuf::BrokerStatus status;
status = state_machine.GetStatus();
REQUIRE(status.progress() == Approx(0.0));
REQUIRE(status.broker_state() == JFJochProtoBuf::DATA_COLLECTION);
for (int i = 0; i < ndatastream; i++) {
for (int m = 0; m < nmodules; m++) {
for (int image_num = 1; image_num <= nimages*summation; image_num++)
aq_devices[i]->AddModule(image_num, m, image.data());
}
aq_devices[i]->Terminate();
}
REQUIRE_NOTHROW(state_machine.Stop());
logger.Info("Stopped measurement");
status = state_machine.GetStatus();
REQUIRE(status.broker_state() == JFJochProtoBuf::IDLE);
auto tmp = state_machine.GetMeasurementStatistics();
REQUIRE(tmp.has_value());
auto statistics = tmp.value();
REQUIRE(statistics.collection_efficiency() == 1.0);
REQUIRE(statistics.images_collected() == 1);
REQUIRE(statistics.images_written() == 1);
REQUIRE(statistics.max_image_number_sent() == 0);
REQUIRE(!statistics.cancelled());
REQUIRE(statistics.file_prefix() == "integration_test_summation");
REQUIRE(statistics.detector_width() == 1030);
REQUIRE(statistics.detector_height() == 514*4);
REQUIRE(statistics.detector_pixel_depth() == 4);
auto preview_image = services.GetPreviewFrame();
REQUIRE(preview_image.pixel_depth() == 2);
REQUIRE(preview_image.data().size() == 514*1030*ndatastream*nmodules*2);
auto preview_image_content = (int16_t *) preview_image.data().data();
REQUIRE(preview_image_content[0] == image[0] * summation);
REQUIRE(preview_image_content[5] == image[5] * summation);
REQUIRE(preview_image_content[36+302*1030] == image[36+300*1024] * summation);
REQUIRE(preview_image_content[514*1030*2+7] == image[7] * summation);
REQUIRE(preview_image_content[514*1030*3+1030*200+7] == image[7+1024*200] * summation);
fpga_receiver_server->Shutdown();
writer_server->Shutdown();
}
TEST_CASE("JFJochIntegrationTest_ZMQ_RAW", "[JFJochReceiver]") {
Logger logger("JFJochIntegrationTest_ZMQ");
ZMQContext zmq_context;