PEACH2 APIの解説(仮)
の編集
https://www.am.ics.keio.ac.jp/proj/asap/wiki/?PEACH2+API%A4%CE%B2%F2%C0%E2%A1%CA%B2%BE%A1%CB
[
トップ
] [
編集
|
差分
|
バックアップ
|
添付
|
リロード
] [
新規
|
一覧
|
検索
|
最終更新
|
ヘルプ
|
ログイン
]
-- 雛形とするページ --
(no template pages)
[[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
タイムスタンプを変更しない
[[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
テキスト整形のルールを表示する
添付ファイル:
TCA-API-en.pptx.pdf
386件
[
詳細
]