0

私は、Mellanox Infiniband ハードウェアで RDMA を使用している Infiniband/RDMA 初心者です。ここでソースコードを使用しました。このプログラムは、一見したところごく普通に実行されます。サーバーは、RDMA_WRITE 操作を使用してクライアント メモリに数バイトを書き込みます。しかし、後で、書き込み完了構造体 (ibv_wc) によって示される転送バイト数が、ibv_send_wr 構造体に入れたデータの量と一致しないことがわかりました。以下は、rdma_write() での ibv_send_wr 初期化のコードです。

ctx->sge_list.addr = (uintptr_t)ctx->buf;
ctx->sge_list.length = ctx->size; //which is 65536
ctx->sge_list.lkey = ctx->mr->lkey;
ctx->wr.wr.rdma.remote_addr = data->remote_connection->vaddr;
ctx->wr.wr_id = RDMA_WRID;
ctx->wr.sg_list = &ctx->sge_list;
ctx->wr_num_sge = 1;
ctx->wr.opcode = IBV_WR_RDMA_WRITE;
ctx->wr.send_flags = IBV_SEND_SIGNALED;
ctx->wr.next = NULL;

次に、書き込み完了キューに書き込み完了エントリを取得した後、ibv_wc.byte_len を読み取ります。32537、32743、32533 の乱数が表示されます。ibv_wc.status が IBV_WC_SUCCESS と等しいため、転送は成功したと思います。私は何か間違ったことをしましたか?

4

1 に答える 1

0

RDMAMojoブログのibv_poll_cq()ページによると、フィールドは操作の小さなサブセットに対してのみ有効であるため、送信キューでの RDMA 書き込み操作の場合、初期化されていないままになります。byte_len

byte_len:転送されたバイト数。着信送信の受信キューまたは即時操作の RDMA 書き込みの場合に関連します。この値には、即値データが存在する場合、その長さは含まれません。RDMA 読み取りおよびアトミック操作の送信キューに関連します。

于 2015-10-06T06:12:35.783 に答える