Exemple #1
0
 // ------------------------------------------------------------------
 // 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();
 }
Exemple #2
0
    // --------------------------------------------------------------------
    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;
        }