とりあえず、APIの使い方のスライド 場所 †/opt/tca/p2driver/PEACH2-RDMA下にAPIが コンパイル †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を使う前に入れる. tcaDMADescInt_Init(); をその後で行なう. ハンドルの作成 †ハンドルの宣言は tcaHandle handle; でつくる. tcaCreateHandle(&handle, &ptr, size, type) handle => 宣言したハンドル名 ptr => ハンドルに設定したいポインター.GPUなどの場合は,あらかじめcudamallocしておいたポインターを設定する size => ptrのサイズ type => GPUの場合はtcaMemoryGPU, CPUの場合はtcaMemoryCPUを使う. で各値を設定する. handle.ptr = PEACH2_MODULE_ADDRESS; みたいに入力できる. 転送 †レジスタモード †16個までのDMA要求をまとめて実行できるモード. * 引数は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で指定した値から転送がスタートする. 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を設定して, ディスクリプタモード †DMAチェーニングが使えるモード. ホストから †こっちが通常っぽいけど使ったことない. WorkRAM †PEACH2上のWorkRAMにディスクリプタをセットする. 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 |