Skip to content

Commit d04266e

Browse files
committed
fmq memory test
1 parent 07546aa commit d04266e

File tree

2 files changed

+76
-1
lines changed

2 files changed

+76
-1
lines changed

CMakeLists.txt

Lines changed: 13 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -338,6 +338,12 @@ add_executable(
338338
$<TARGET_OBJECTS:objReadoutUtils>
339339
)
340340

341+
# a test for FMQ memory
342+
add_executable(
343+
o2-readout-test-fmq-memory
344+
${SOURCE_DIR}/testFmqMemory.cxx
345+
)
346+
341347

342348
# a test to check memory banks
343349
add_executable(
@@ -400,7 +406,7 @@ add_executable(
400406

401407
# disable some executables when corresponding dependencies not found
402408
if (NOT FairMQ_FOUND)
403-
set_target_properties(o2-readout-test-fmq-tx o2-readout-test-fmq-rx o2-readout-test-fmq-perf-tx o2-readout-test-fmq-perf-rx PROPERTIES EXCLUDE_FROM_ALL 1)
409+
set_target_properties(o2-readout-test-fmq-tx o2-readout-test-fmq-rx o2-readout-test-fmq-perf-tx o2-readout-test-fmq-perf-rx o2-readout-test-fmq-memory PROPERTIES EXCLUDE_FROM_ALL 1)
404410
endif ()
405411

406412
# set include and libraries for all
@@ -419,6 +425,12 @@ if (${ZMQ_FOUND})
419425
list (APPEND executables o2-readout-monitor)
420426
endif()
421427

428+
# special minimal build for test-fmq-memory (to avoid grpc garbage from occ when using valgrind)
429+
foreach (exe o2-readout-test-fmq-memory)
430+
list (APPEND executables ${exe})
431+
target_include_directories(${exe} PRIVATE ${READOUT_INCLUDE_DIRS})
432+
target_link_libraries(${exe} PRIVATE $<$<BOOL:${FairMQ_FOUND}>:FairMQ::FairMQ>)
433+
endforeach()
422434

423435
###################################################
424436
# files installation

src/testFmqMemory.cxx

Lines changed: 63 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,63 @@
1+
#include <stdio.h>
2+
#include <unistd.h>
3+
#include <string.h>
4+
5+
#include <fairmq/FairMQDevice.h>
6+
#include <fairmq/FairMQTransportFactory.h>
7+
//#include <fairmq/tools/Unique.h>
8+
9+
#define GB *1073741824LLU
10+
#define SLEEPTIME 3
11+
#define WAITHERE printf("Waiting %ds ",SLEEPTIME); for(int k=0; k<SLEEPTIME; k++) {printf(".");fflush(stdout);usleep(1000000);} printf("\n");
12+
13+
14+
int main(int argc, const char* argv[]) {
15+
16+
unsigned int ngb = 1;
17+
if (argc>=2) {
18+
ngb=(unsigned int)atoi(argv[1]);
19+
} else {
20+
printf("Usage: %s numberOfGigabytes\n",argv[0]);
21+
return -1;
22+
}
23+
24+
std::unique_ptr<FairMQChannel> sendingChannel;
25+
std::shared_ptr<FairMQTransportFactory> transportFactory;
26+
FairMQUnmanagedRegionPtr memoryBuffer = nullptr;
27+
FairMQProgOptions fmqOptions;
28+
29+
printf("Create FMQ channel\n");
30+
// random name: use fair::mq::tools::Uuid()
31+
transportFactory = FairMQTransportFactory::CreateTransportFactory("shmem", "readout-test", &fmqOptions);
32+
sendingChannel = std::make_unique<FairMQChannel>("readout-test", "pair", transportFactory);
33+
WAITHERE;
34+
35+
printf("Get unmanaged memory\n");
36+
long long mMemorySize = ngb GB;
37+
memoryBuffer = sendingChannel->Transport()->CreateUnmanagedRegion(mMemorySize, [](void* /*data*/, size_t /*size*/, void* /*hint*/) {});
38+
if (memoryBuffer==nullptr) { printf("Failed to get buffer\n"); return 1; }
39+
printf("Got %p : %llu\n", memoryBuffer->GetData(), (unsigned long long)memoryBuffer->GetSize());
40+
WAITHERE;
41+
42+
printf("Write to memory\n");
43+
for (unsigned int i=0; i<ngb; i++) {
44+
char *ptr=(char *)memoryBuffer->GetData();
45+
ptr=&ptr[i GB];
46+
printf("#%u : writing @%p\n",i+1, ptr);
47+
memset(ptr,0,1 GB);
48+
}
49+
printf("Done writing\n");
50+
WAITHERE;
51+
52+
printf("Cleanup FMQ unmanaged region\n");
53+
memoryBuffer = nullptr;
54+
WAITHERE;
55+
56+
printf("Cleanup FMQ channel\n");
57+
sendingChannel.reset();
58+
transportFactory.reset();
59+
WAITHERE;
60+
61+
printf("Exit\n");
62+
return 0;
63+
}

0 commit comments

Comments
 (0)