[[ASAP Top]]

#contents

とりあえず、APIの使い方のスライド
#ref(TCA-API-en.pptx.pdf)
* 場所 [#p8db3b40]
/opt/tca/p2driver/PEACH2-RDMA下にAPIが~
/opt/tca/p2driver/PEACH2-PCIe-driver下にはドライバがあります.

* コンパイル [#vdb5283f]
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
とすれば良い.

* 使い方 [#h7008739]

** インクルード [#v58079ba]
 #inckude "peach2_pcie_ioctl.h"
 extern "C" {
  #include "tca-api,h"
 }
extern "C"は,C言語として解釈せよ,とのこと.マングリングを防ぐ.

** 初期化 [#re411973]
必ず.
 tcaInit();
をtca系のAPIを使う前に入れる.~
WorkRAMを使うAPIを使う場合は
 tcaDMADescInt_Init();
をその後で行なう.~
これは,WorkRAMの初期化を行なう.

** ハンドルの作成 [#f3e038c8]

ハンドルの宣言は
 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で使えるアドレスになっていないので,~
この方法で直接設定することはできません.
 
** 転送 [#t4fe1ce9]
*** レジスタモード [#i22e1c60]

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 [#i7a7e9ab]
引数の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 [#d124711a]
いくつかフラグが用意されているが,通常使うのは~
 tcaDMAContinue
 tcaDMANotify
ブロックの最後のtcaSetDMAReg_MemcpyにはNotifyを設定して,~
それ以外はContinueを使う.

** ディスクリプタモード [#b5afcc65]
DMAチェーニングが使えるモード.~
ポインタで連結したディスクリプタを用意しておき,これをPEACH2が順に読み込むことで,転送をスタートする.~
転送できる要求の個数が無制限(レジスタモードは16個が限界).~
ホストから読み出すモードと,WorkRAMモードがある.
*** ホストから [#g7cfc156]
こっちが通常っぽいけど使ったことない.
*** WorkRAM [#v03cb85c]
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の使い方などは同じ.

** 既知のバグ? [#y8f7465d]

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

written by kuhataku 2014-08-29

トップ   編集 差分 バックアップ 添付 複製 名前変更 リロード   新規 一覧 検索 最終更新   ヘルプ   最終更新のRSS