ASAP Top

とりあえず、APIの使い方のスライド

場所

/opt/tca/p2driver/PEACH2-RDMA下にAPIが
/opt/tca/p2driver/PEACH2-PCIe-driver下にはドライバがあります.

コンパイル

PEACH2-RDMA下のtca-comm.o,とtca_gpu.oをリンクする必要がある.

ar -rcs ./libtca.a /opt/tca/p2driver/PEACH2-RDMA/{tca_comm.o,tca_gpu.o}

などでライブラリを作り,

nvcc -arch=sm_35 -lcuda -lcudart  -ltcat -I/opt/tca/p2driver/PEACH2-RDMA target.cpp -o target.o

とすれば良い.

使い方

インクルード

#inckude "peach2_pcie_ioctl.h"
extern "C" {
 #include "tca-api,h"
}

extern "C"は,C言語として解釈せよ,とのこと.マングリングを防ぐ.

初期化

必ず.

tcaInit();

をtca系のAPIを使う前に入れる.
WorkRAMを使うAPIを使う場合は

tcaDMADescInt_Init();

をその後で行なう.
これは,WorkRAMの初期化を行なう.

ハンドルの作成

ハンドルの宣言は

tcaHandle handle;

でつくる.
ハンドルは,nodeid, ptr, size, typeの値を持つ構造体で,

tcaCreateHandle(&handle, &ptr, size, type)
handle => 宣言したハンドル名
ptr => ハンドルに設定したいポインター.GPUなどの場合は,あらかじめcudamallocしておいたポインターを設定する
size => ptrのサイズ
type => GPUの場合はtcaMemoryGPU, CPUの場合はtcaMemoryCPUを使う.

で各値を設定する.
後から直接値を設定することも可能で,PEACH2のアドレスなどを直接設定したい場合は,

handle.ptr = PEACH2_MODULE_ADDRESS;

みたいに入力できる.
ただし,CudaMallocで取得したGPUのポインタなどは,APIで使えるアドレスになっていないので,
この方法で直接設定することはできません.

転送

レジスタモード

16個までのDMA要求をまとめて実行できるモード.
PEACH内のレジスタに要求をセットするモードで,起動が高速.

* 引数はapiを調べてください
tcaSetDMAReg_Memcpy(dma_ch,numslot,&numslot,&dst_handle,offset,&src_handle,offset,size,tcaDMAflag, rwait)・・・レジスタにセット
tcaStartDMAReg(dma_ch, numslot)・・・転送キック
tcaWaitDMARecvReg(handle, rwait)・・・DMA終了のwait

* numslot

引数のnumslotは,セットするたびに1増える値で,キックするときには,引数のnumslotで指定した値から転送がスタートする.
これは転送をいくつかのまとまりにする場合に使える.
例えば,転送ブロック1(転送4回),転送ブロック2(転送2回),転送ブロック3(転送3回)としたいときは

numslot_block1 = 0;
tcaSetDMAReg_Memcpy();//転送ブロック1
tcaSetDMAReg_Memcpy();
tcaSetDMAReg_Memcpy();
tcaSetDMAReg_Memcpy();
numslot_block2 = numslot;
tcaSetDMAReg_Memcpy();//転送ブロック2
tcaSetDMAReg_Memcpy();
numslot_block3 = numslot; 
tcaSetDMAReg_Memcpy();//転送ブロック3
tcaSetDMAReg_Memcpy();
tcaSetDMAReg_Memcpy();

としておいて,転送ブロック2をキックするときには,

tcaStartDMAReg(dma_ch, numslot_block2)

とすれば良い.

* tcaDMAflag

いくつかフラグが用意されているが,通常使うのは

tcaDMAContinue
tcaDMANotify

ブロックの最後のtcaSetDMAReg_MemcpyにはNotifyを設定して,
それ以外はContinueを使う.

ディスクリプタモード

DMAチェーニングが使えるモード.
ポインタで連結したディスクリプタを用意しておき,これをPEACH2が順に読み込むことで,転送をスタートする.
転送できる要求の個数が無制限(レジスタモードは16個が限界).
ホストから読み出すモードと,WorkRAMモードがある.

ホストから

こっちが通常っぽいけど使ったことない.

WorkRAM

PEACH2上のWorkRAMにディスクリプタをセットする.
さきほど無制限と書いたが,WorkRAMの場合は,容量の問題上,1024個までしか置けない.
こっちはなぜかは分からないが高速らしい.

tcaSetDMADescInt_Memcpy(numslot,&numslot,&dst_handle,offset,&src_handle,offset,size,tcaDMAflag, tag)・・・レジスタにセット
tcaStartDMADesc(numslot)・・・転送キック
tcaWaitDMARecvDesc(handle, rwait,tag)・・・DMA終了のwait

numslotや,flagの使い方などは同じ.

既知のバグ?

waitを何百回もコールするとうまく値が読み込めなくて, waitでストップしてしまう.

written by kuhataku 2014-08-29


添付ファイル: fileTCA-API-en.pptx.pdf 203件 [詳細]

トップ   編集 凍結 差分 バックアップ 添付 複製 名前変更 リロード   新規 一覧 検索 最終更新   ヘルプ   最終更新のRSS
Last-modified: 2019-08-29 (木) 00:03:48