>>930 SPEはネットワークでグリッドするのも一役狙ってたんだが、肝心のソフトが出てこないね。
SPEってどっちだよ
SPUだった。そーりー。
ソニーピクチャーズ
936 :
デフォルトの名無しさん:2009/04/22(水) 18:14:33
>>936 それって3Dライブラリじゃないの?良く知らんが。
Cellでエンコするなら別のコード書くんじゃない?
ミスタエッジ
.
長い実行時間のJOB を流しながら短い時間のプログラムのデバッグを
していたら長い方のJOBが引っかかって停止(ループ)したようなんですが
そんな経験ありますか。
と言うか、タスク切替えの時にSPUの情報は退避されないとかの仕様ですか。
>>940 あります
>>941 普通のコアならレジスタさえ退避しておけばメモリ勝手に流れるけど、
SPEは独立メモリだからそういう細工が出来ない模様
それがネックになってCELLの評価キットでの開発が頓挫した経験ならあります。
要は、SPEを使うようなプログラムを複数動かさなければいいんだろうけどねぇ。
まさかの団子の低脳レス
回答ありがとうございます。思い切った仕様ですね。
あれから実験してみまして表と裏で流すSPEの数の合計が6を越えなければ
避けて実行してくれるみたいなんでしばらくそういう形でいきたいとおもいます。
SDK3.2まだー
Xserver を SPE 使って書いたりできないってことですよね。
>>947 いいえ、どんなプログラムであろうともSPEを使うように書くことはできます。
SPEを使ってXServerプログラムを書くことも、難しいかもしれませんができないことではないと思います。
どちらにしても、意味がないだけで。
spuでls内の数kバイト連続したベクタデータを何回もコピーする必要があるのですが、memcpyでコピーするよりも、DMAでコピーしたほうが速いですか?
memcpyだと3GB/sec位しかでませんでした。
ちなみに、ベタでループで代入する方法で、-funroll-loopsオプションをつけたら、memcpyよりも高速でした。
これは、memcpyが1バイトごとにコピーしているのに対してベタなのはベクタデータでレジスタ沢山使ってコピーしているからですかね。
memcpy意外で、賢いやり方はありませんか?
DMAだと、レイテンシが馬鹿にならないので。
ループ代入でコピーする方法では25.6GB/sec近くのコピー速度になるとは思いますが
それでも不満でしたらコピーしないですむ方法や同時計算を考えるしかないと思います。
どんな処理をするのかはわかりませんが
例えば、コピーした後何らかのデータ更新をするというなら
コピー元からロードして、更新したらコピー先にそのままストアするといった具合にです。
>>950 ここで仰る25.6G/sというのはDMA転送のことなのでしょうか?
それとも、LS内部でのことでしょうか?
やりたいことは例えばベクタ配列A[1000]とB[1000]があって、
下記の様な処理を行いたいと考えています。
(DMA転送部分は簡略化しています。)
for(i=0;i<1000;i++){
DMAGET(A, MainMem_Addr+i*addr, 1000*sizeof(vector float));
for(j=0;j<1000;j++){
A[j] = A[j] + B[j];
}
B[0] = A[j-1];
memcpy(&B[1], &A[0], 999*sizeof(vector float));
DMAPUT(A, MainMem_Addr1+i*addr 1000*sizeof(vector float));
}
ここで、memcpyを行うよりもDMAの方が高速であればそれでよいのですが、
このような処理が各SPUで行うので、帯域が足りなくなり、そこがボトルネックになります。
極力DMA転送を減らしたいと思ってこのような方法を考えたのですが、
memcpyが思ったよりも速度がでないのでは、DMAでやった方がいいのですかね。
Aと同じ大きさのバッファをもう一つ持ってダブルバッファリングして、
Bはなくしてしまえばいい。memcpyが不要になる。
vector float A[2][1000];
int idx = 0;
int offset = 0;
A[1](旧B)の初期化処理
for(i=0;i<1000;i++){
DMAGET(A[idx], MainMem_Addr+i*addr, 1000*sizeof(vector float));
vector float *temp_0 = A[idx];
vector float *temp_1 = A[idx^1][1000-offset];
for(j=0;j<offset;j++){
temp_0[j] = temp_0[j] + temp_1[j];
}
vector float *temp_2 = A[idx][offset];
vector float *temp_3 = A[idx^1][0];
for(j=0;j<1000-offset;j++){
temp_2[j] = temp_2[j] + temp_3[j];
}
DMAPUT(A[idx], MainMem_Addr1+i*addr 1000*sizeof(vector float));
idx ^= 1;
}
ちゃんと確認してないから間違いはあるかも。
トリプルバッファ使ったりすればDMA転送の時間も一部隠蔽できるけどね。(余裕があれば試してみればいい)
>>952が難しければ16byte単位でコピーするmemcpyを自作して置き換えるだけでも少し早くなるよ。
LSに余裕があるなら、ここに特化した999のvector floatをループ無しでコピーする専用の処理を作るのもありだw
「笑えよベジータ」←いまここ
なにこの癒されbar
/opt/cell/sdk/src/demos/FFT16M
の実行された方いますか。サイズを変えたりとか。
DMAって同じLS内にかけられたっけ?
やったことないや。
EAにマップされてるから指定自体はできそう。
DMAかけるとそこは並列に動くのでパフォーマンスあがる可能性はあるかもね。
それよりまず
>>951はダブルバッファからだけどw
SPE で処理をさせている間に PPE でも処理をさせたいので
PPE で生成した子スレッドで spe_context_run() を呼び出そうと
思うのですが子スレッドがSPEの処理を待っている間は PPE のCPU時間
の半分を使ってしまうのでしょうか。
スレッドはブロックされるとのことで CPU 時間はほぼ消費しないようですね。
おさわがせしました。
> リアルSCEIの人
インソムニアックがLarrabeeの調査してるみたいだね。
いろいろ勘繰りたいこともあるんだが、おまいら、本当にそれでいいのか?
そりゃ調査させるくらい安いもんだろ
LRBは使えないってことで結論でたよ
残念、現在進行形
産業で大胆仮説いっちゃうよ
インソが
ゲイツ(Xbox陣営)に
NTR
そのLarrabeeですら現在進行形
まあ、幾つかベンチスコアでっちあげて
お蔵入りになるだろうね。Intelではよくあること。
グランツーリスモ5のことですね。よくわかります。
次世代XBOXのGPUは継続してAMDって話をきいたが
誰に聞いたの?
君のおとうさんの知り合いのインターネットの会社の人?
>>968 お前と同じくインターネットの情報だよ。
ついでだからここで君のループアンロールの知識を披露してくれ。
袋叩きにあうから
>>952 >>951です。
ありがとうございます。
既にダブルバッファを使っていて、DMAがいっぱいいっぱいになってしまっていて、
SPUが遊んでいて、DMA帯域にを少しでも軽減できればLS内でのmemcpyと思っていました。
>idx ^=1
こんなやり方があったのですね。
idx = (idx+1)%2
とかやっていました。
こいのぼりやさんだよ
今日も団子さんのリファラオナニーが冴えてるな
うるしあこいのぼりぶつけんぞ
gatekeeper2.scei.jp
↑ねえこれ新しいサーバ?
名乗ってるだけマシ
団子さんを毛嫌いしている訳じゃないし、
実力のあるお方だとは思うけど、
その実力以上の口だけ者感は否めなかったなぁ〜
なんだかんだでスレは(前々からの事で)勿論、こないだのコンテストにも貢献してたと思うけど
SPE から呼び出せるLAPACKとかがないとつかいにくいね。