セットアップの部分は最新ではないが、やり方は一緒2014-04-30

スクリプトの使い方

peachDrivers.jpg

PEACH2

dma_test : バッファidの開始アドレスsourceからsize分の値をdstにcount回DMA転送する

$ ./dma_test id source dst size count ch
idデバイスの番号なので,常に0
sourceDMAの読み込みアドレス
dst書き込みアドレス
sizeサイズ, 4の倍数にすべき
count同じ転送パターンを何度繰り返すか
ch使うDMAチャネル (0~3: chaining DMA, 0x10~0x13: レジスタモードのch0~3)
dma_test.jpg

$ ./dma_test 0 0 0x3c8030000000 4096 1 0x10

DMAでDDR3へ値を転送

$ ./dma_test 0 0 `./getbuf 0 0 buf` 0x110000000 128 1 0x10

source, dstを0にセットすると,あらかじめドライバの中に用意している
デフォルトの通信バッファを利用
デフォルトの通信バッファのアドレスは↓とするとバス側のアドレスが分かる

$ ./getbuf 0 0 bus

getbuf : PEACH2(PCIe)上のバッファidの開始アドレス/長さを得る

bufで取れた値は再起動する毎に値が変わるので注意 by 塙先生

$ ./getbuf id buf {virt,bus,len}
buf0:デフォルト, 1~:よくわからん
bus通信バッファの開始アドレス
virt通信バッファの開始仮想アドレス
len通信バッファの長さ (0:2097152)
r開始アドレスに+0x10000したアドレス。特に意味は無い
$ ./getbuf 0 0 bus

memread : バッファidの指定された開始アドレスadrからsize分の領域の値を見る

$ ./memread id bar adr size

barを-1 を指定した場合,ソースアドレスはホスト側からみた生のバスアドレス 例

$ ./memread 0 -1 `./getbuf 0 0 bus` 128
$ ./memread 0 6 0 128 <- 0番バッファに限り

DDR3は内部デバイスなので,以下のようにする。

$ ./memread 0 0 0x10000000 256

DDR3でbarを-1にするとクラッシュする。 by 塙先生

3c0110000000 だとBAR4アドレスになるはずですが,
Memory Readオペレーションの戻りのCompletionにはちゃんと対応できていないと思われるので,
ホストがロックするのだと思います。

memset : 対話形式で、バッファidの指定された開始アドレスadrからsize分の領域に値を書き込む

$ ./memset id bar adr size

$ ./memset 0 -1 `getbuf 0 0 bus` 128

memcount : バッファidの指定された開始アドレスadrからsize分の領域に0からカウントアップした値を書き込む

$ ./memcount id bar adr size

$ ./memcount 0 -1 `./getbuf 0 0 bus` 128

NVIDIA

rdma_test:cudaMallocで待機し、dma_testで所定のアドレスに書き込むとGPUのメモリに転送

マップされたPCIeアドレスはいつも一緒

$ ./rdma_test dev size

手順

$ ./rdma_test 0 128
  gpuid=0
  capability 3.5
  0 3c8050000000  <- マップされたPCIeアドレスが表示されます.(最初の数字はページ番号で,1ページ=64KBです.)
  Wait for any key...

で,cudaMalloc して PCIe をマップした状態でキー入力待ちになります.
従って,PEACH2からは

$ ./memcount 0 6 0 4096
$ ./dma_test 0 0 0x3c8030000000 4096 1 0x10

とすれば,デフォルトのバッファに0~0x3ffが書き込まれたものをGPUメモリにDMAすることになります.
DMAが終了したら,rdma_test 側で何かキーを押してやると,GPUメモリの値を表示して終わります。
このときに,0~0x3ff が表示されれば成功,ということです.

逆ももちろん動きますので,rdma_test.cu に初期値のセットを追加して,

$ ./dma_test 0 0x3c8030000000 0 4096 1 0x10
$ ./memread 0 6 0 4096

でCPU側に書き込まれたことを確認できます.

DDR3

dma_testのdstを0x0x3c01_1000_0000にする

$ ./dma_test 0 0 0x3c0110000000 128 1 0x10

セットアップ

起動時に/etc/rc.d/init.dに置かれた、wakeup_GPU_PEACH2.shが以下の作業をしている

PEACH2ドライバ

$ cd /usr/src/nvidia-310.32 <- NVIDIAのドライバのバージョン
$ make module
$ vim Makefile
   PATH_TO_EXTRACTED_DRIVER_PACKAGE := /usr/src/nvidia-310.32 <- 一緒にする
$ ln -s /usr/src/nvidia-310.32/conftest.sh
$ make <- Kernel Objectの作成
# init.sh <- Kernel Objectの登録とパーミッション変更

GPU編

$ nvcc -arch=sm_35 rdma_test.cu peach2-p2p-util.cu -o rdma_test -lcuda
$ init.sh

DDR3への書き込み

$ /opt/tca/PEACH2-PCIe-driver/set_nodeinfo 0 0 \
$ /opt/tca/PEACH2-PCIe-driver/memorymap.txt \
$ /opt/tca/PEACH2-PCIe-driver/routing.txt \
$ /opt/tca/PEACH2-PCIe-driver/null.txt
$ cat /sys/class/tca/peach2_0/routing/*

出てきた値の最後の2行目が↓ならおk

$  00010000 00012000 007fff00
$  00000000 ffffc3ff

確認

$ ls /dev/
crw-rw-rw-  1 root root    195,   0  5月 28 14:41 2013 nvidia0
crw-rw-rw-  1 root root    195,   1  5月 28 14:41 2013 nvidia1
crw-rw-rw-  1 root wheel   245,   0  5月 28 14:41 2013 peach2_pcie0
crw-rw-rw-  1 root wheel   245,   1  5月 28 14:41 2013 peach2_pcie1
crw-rw-rw-  1 root wheel   244,   0  5月 28 16:03 2013 nvidia_p2p_tca

塙先生からのメール

PEACH2ドライバ

宮島さん,
塙です。

ドライバを送ります。

NVIDIA-p2p-driver の方は,NVIDIAドライバのファイルをいくつか必要としています.
まず,NVIDIAドライバの kernel/ ディレクトリ中で,
% make module
を実行します。
その後,NVIDIA-p2p-driver の Makefile を適切に修正し,
conftest.sh のシンボリックリンクを直して make してください.

PEACH2 のドライバは make だけでOKです.(CentOS 6.3 系でしか試していません.)

どちらも,ディレクトリにある ./init.sh を実行してください.

テストプログラムは,PEACH2のドライバ中にいくつかありますが,
とりあえず dma を試すとして,dma_test.c をコンパイルしてください.
(以下,同様に,hoge コマンドのソースを hoge.c とします.)

使い方:
./dma_test id source dst size count ch

id はデバイスの番号なので,常に0
source は DMAの読み込みアドレス
dst は書き込みアドレス
size はサイズ
count は同じ転送パターンを何度繰り返すか
ch は使うDMAチャネル  (0~3: chaining DMA, 0x10~0x13: レジスタモードのch0~3)

source, dstを0にセットすると,
あらかじめドライバの中に用意しているデフォルトの通信バッファを使います。

デフォルトの通信バッファのアドレスは
./getbuf 0 0 bus
とするとバス側のアドレスが分かります.

バッファの中身を見るには,
./memread 0 -1 上で得たアドレス サイズ 
または0番バッファに限り
./memread 0 6 オフセット サイズ
です.
値をセットするには,同様に memset です.
面倒な場合は,memcount で値をカウントアップでセットします.

例えば,こんなシェルスクリプトを使って、
ノード内のドライバ中のバッファ間DMAのテストができます.
(./getbuf 0 0 r は,0番バッファ+0x10000 のアドレスを返します.)

--
#!/bin/sh

MEMADDR0=`./getbuf 0 0 bus`
echo $MEMADDR0
VIRTADDR0=`./getbuf 0 0 virt`
echo $VIRTADDR0

./memcount 0 6 0 $1

RECV0=`./getbuf 0 0 r`
echo $RECV0

./dma_test 0 0 $RECV0 $1 $2 0x10
--

このとき,dmesg でカーネルメッセージを見ると,
そのDMAにかかった時間を表示します.
ステータスレジスタをpollingした値と,
割込みがかかって割込みハンドラで測定した値と,両方が表示されます.

長くなったので,GPU編は別のメールにします.

GPU編

塙です。

GPU編です.

テストプログラムを添付します。
 
ヘッダファイルにいろいろシンボリックリンクが飛んでいますが,
ほとんど先ほど送ったドライバに含まれているもので,
nv-p2p.h については NVIDIAドライバの kernelの中にあります.

コンパイルは,
% nvcc -arch=sm_35 rdma_test.cu peach2-p2p-util.cu -o rdma_test -lcuda
です.

使い方ですが,
./rdma_test GPUのID サイズ
で,cudaMalloc して PCIe をマップした状態でキー入力待ちになります.

そのとき,
0 3c8030000000
のようにマップされたPCIeアドレスが表示されます.
(最初の数字はページ番号で,1ページ=64KBです.)

従って,PEACH2からは
./memcount 0 6 0 4096
./dma_test 0 0 0x3c8030000000 4096 1 0x10
とすれば,デフォルトのバッファに
0~0x3ffが書き込まれたものをGPUメモリにDMAすることになります.
DMAが終了したら,rdma_test 側で何かキーを押してやると,
GPUメモリの値を表示して終わります。
このときに,0~0x3ff が表示されれば成功,ということです.

逆ももちろん動きますので,rdma_test.cu に初期値のセットを追加して,
./dma_test 0 0x3c8030000000 0 4096 1 0x10
./memread 0 6 0 4096
でCPU側に書き込まれたことを確認できます.

よろしくお願いします。
2013年5月14日 12:02 Toshihiro HANAWA <hanawa@ccs.tsukuba.ac.jp>:
宮島さん,
塙です。

PEACH2ボードとK20とを同じCPUソケットにぶら下げる必要があります。
異なるCPUソケットだと全然性能が出ません。
ただ,スロットの関係で,同時にK20 2枚+PEACH2 は挿せないかも知れません。
(IBがなければつけられるかも... 記憶が定かではない)

PEACH2用のドライバをあげますと言いつつ忘れていたと思います。
夕方にもまとめてお送りしたいと思います。

NVIDIAのドライバ(ソースコードも)が必要ですので,
インストールしておいてください.

P.S.
こちらは,8ノードクラスタがようやく設定が終わって動き始めました.
TCAとしてリング状につないで相互に通信ができるところまでは確認しました.
隣接2ノードCPU間で最短900ns, 1hopすると +2~300ns,というところです.

よろしくお願いします。 

塙 敏博
Toshihiro HANAWA
hanawa@ccs.tsukuba.ac.jp

DDR3への書き込み

久原さん, 
塙です。

メモリの量をCPUソケット毎に変えるのはあまりよろしくないと思いますので, 
両方のCPUソケットから抜いた方がよろしいかと.

本当は,いまPEACH2を接続しているスロットから,ケーブルで外部接続するのがベストです.
こちらで,試そうとしているPCIe cable extension製品があるので,
問題なさそうならご紹介します。

私もまだふんが研にはログインできるので,
デバイスファイルへのアクセスなどパーミッションがあれば,
こちらで試してみることもできます.

Nios IIは介さずに直接PCIeでDDR3を読み書きできます.

ただし,設定が少し必要です.
ファイルを3つ作ってください。名前は任意でいいんですが.

memorymap.txt:

# NodeID prefix PEACH2-BAR4	GPU0-BAR0	GPU1-BAR0	#recvqueue
0	1	3c000000	3c803000	0		

routing.txt:

# node Eport Wport Sport
0	-1	-1	-1

null.txt:
中身は空でいいです.

それらを使って,
./set_nodeinfo 0 0 ../memorymap.txt ../routing.txt ./null.txt

で経路情報を設定します.


cat /sys/class/tca/peach2_0/routing/*
で確認して,
00000000 00000000 00000000
00000000 00000000 00000000
00000000 00000000 00000000
00000000 00000000 00000000
00000000 00000000 00000000
00000000 00000000 00000000
00000001 00000001 0000000f
00010000 00012000 007fff00
00000000 ffffc3ff

となっていれば大丈夫です.

最後から2行目が重要で,PEACH2 内部リソースのアドレス決定ルールを示しています。
これは,
宛先アドレスと,0x007f_ff00_0000 のANDを取って(=x),
0x1_0000_0000 <= x <= 0x1_2000_0000
の場合に内部リソースに向かう,ということです.

DDR3 アドレスは 0x1000_0000 に決まっているので,
./dma_test などを使って、0x1_1000_0000 に対して書き込みをすれば,
DDR3に書き込まれることになります. 
これは Nios II からも読み書きできます.
( 16進数の中の _ は桁を見やすくするために入れているだけなので,
適宜外してください。)

GPUからの(直接)読み書きは,現状では無理です。
ただ,NVIDIAで対応はしてもらっていて,できるようになるかも知れません。

よろしくお願いします。


塙 敏博
Toshihiro HANAWA
hanawa@ccs.tsukuba.ac.jp

DDR3への書き込みアドレスについて追記

宮島さん,
塙です.

原因がわかりました,

DMACからのアクセスのときに,オフセット計算を通っているので,
上位32bitには 0x3c01 をセットしておく必要があります.
従って、

./dma_test 0 $DEFADDR 0x3c0110000000 $DMASIZE $ITER $DMACHAN;

で問題なく書き込まれました.

あるいは,memorymap.txt の中の,PEACH2-BAR4 のフィールドを 0 にしておけば 0x110000000 で大丈夫です.

よろしくお願いします.

written by keimiya


添付ファイル: filedma_test.jpg 140件 [詳細] filepeachDrivers.jpg 123件 [詳細]

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