// ------------------------------------------------------------------ // helper fuction for printing CRC32 and short memory dump // ------------------------------------------------------------------ inline std::string mem_crc32( const void* address, size_t length, const char* txt) { const uint64_t *uintBuf = static_cast<const uint64_t*>(address); std::stringstream temp; temp << "Memory: "; temp << "address " << hexpointer(address) << "length " << hexuint32(length) << "CRC32: " << hexuint32(crc32(address,length)); for (size_t i=0; i < (std::min)(length/8, size_t(128)); i++) { temp << hexuint64(*uintBuf++); } temp << ": " << txt; return temp.str(); }
// -------------------------------------------------------------------- void rma_receiver::read_one_chunk( fi_addr_t src_addr, region_type *get_region, const void *remoteAddr, uint64_t rkey) { // post the rdma read/get LOG_DEBUG_MSG("rma_receiver " << hexpointer(this) << "RDMA Get fi_read :" << "client " << hexpointer(endpoint_) << "fi_addr " << hexpointer(src_addr_) << "tag " << hexuint64(header_->tag()) << "local addr " << hexpointer(get_region->get_address()) << "local desc " << hexpointer(get_region->get_desc()) << "size " << hexlength(get_region->get_message_length()) << "rkey " << hexpointer(rkey) << "remote cpos " << hexpointer(remoteAddr)); // count reads ++rma_reads_; ssize_t ret = 0; for (std::size_t k = 0; true; ++k) { LOG_EXCLUSIVE( // write a pattern and dump out data for debugging purposes uint32_t *buffer = reinterpret_cast<uint32_t*>(get_region->get_address()); std::fill(buffer, buffer + get_region->get_size()/4, 0xDEADC0DE); LOG_TRACE_MSG( CRC32_MEM(get_region->get_address(), c.size_, "(RDMA GET region (pre-fi_read))")); ); ret = fi_read(endpoint_, get_region->get_address(), get_region->get_message_length(), get_region->get_desc(), src_addr_, (uint64_t)(remoteAddr), rkey, this); if (ret == -FI_EAGAIN) { LOG_ERROR_MSG("receiver " << hexpointer(this) << "reposting fi_read...\n"); hpx::util::detail::yield_k(k, "libfabric::receiver::async_read"); continue; } if (ret) throw fabric_error(ret, "fi_read"); break; }