This feature is scheduled to be demonstrated in DP System Demo 7.1 (https://confluence.skatelescope.org/display/SE/2020-06-17+DP+ART+System+Demo+7.1).
The updated RDMA code is available at https://gitlab.com/ska-telescope/rdma-data-transport/ and contains the files RDMAapi.c and RDMAapi.h. This can also be used to simulate and FPGA sending (eg one block of) visibilties via RDMA by:
./receive -f_../visibilityfiles/GLEAM_small_subset_intensity_SP_ -b1 -m1046528 -s
This presumes there is a visibility file called ../visibilityfiles/GLEAM_small_subset_intensity_SP.0
The snapshot imaging pipeline uses the code at https://gitlab.com/ska-telescope/sep_pipeline_imaging with the following changes:
RDMAapi.c should be put in the folder /imaging/src
RDMAapi.h should be put in the folder /imaging
The file /imaging/CMakeLists.txt should include the lines:
cuda_add-executable(
... existing executables
src/RDMAapi.c
)
The file /imaging/CMakeLists.txt should include the lines:
target_link_libraries(... existing libraries rdmacm ibverbs)
The file /imaging/src/controller.cpp should include the lines (at line 32):
#ifdef __cplusplus
extern "C"
{ #endif #include "../RDMAapi.h" #ifdef __cplusplus }
#endif
The file /imaging/src/controller.cpp should include the lines in function load_vis_into_memory_regions (at line 166):
uint32_t messageSize = regions->num_visibilities * sizeof(Complex);
int numMemoryBlocks = NUM_MEM_REGIONS;
int numContiguousMessages = 1;
void **memoryBlocks = NULL;
memoryBlocks = (void**)malloc(sizeof(void *) * numMemoryBlocks);
int memoryBlockSize = messageSize*numContiguousMessages;
for (int blockIndex=0; blockIndex<numMemoryBlocks; blockIndex++)
{ memoryBlocks[blockIndex] = (void*)regions->memory_region[blockIndex]; }
rdmaTransferMemoryBlocksWithDefaultDevice(RECV_MODE, memoryBlocks, messageSize,
numMemoryBlocks, 1, 0, 0, NULL);
for (int blockIndex=0; blockIndex<numMemoryBlocks; blockIndex++)
{ memory_region_ready[blockIndex] = true; // Note eventually want to make this dynamic so can execute as each memory region received }
free(memoryBlocks);
return 0;