マルチスレッドプログラミング相談室 その5

このエントリーをはてなブックマークに追加
952デフォルトの名無しさん:2007/08/11(土) 00:48:36
素直に mutex とか CRITICAL_SECTION とか使っとけばいいよ・・・
あれらはちゃんと入口と出口でメモリバリアかけてくれてるから。

自分でメモリバリアなんか扱うのは、mutex 実装してる人とか OS の中を作ってる人とか、
あとどうしてもパフォーマンスが気になる速度狂な人くらい。
953デフォルトの名無しさん:2007/08/11(土) 00:53:14
pthreadやWin32 APIにも
Java相当のvolatile read/writeやCASが追加されるんじゃね?
その辺の仕様が固まった時期より有効性が認められているだろうし。
954デフォルトの名無しさん:2007/08/11(土) 00:54:10
FPGA使ってるから、mutexじゃ間に合わねーの
ほぼDDR2 533と同速度でデータ流れてくるから
こえーのなんのって

955デフォルトの名無しさん:2007/08/11(土) 00:59:52
そりゃ大変そうだ・・・がんばれ
956デフォルトの名無しさん:2007/08/11(土) 01:00:34
そんな環境じゃPOSIX仕様での保証とかどうでもいいよね。
好きなだけインラインアセンブラ使ってくれw
957デフォルトの名無しさん:2007/08/11(土) 01:04:33
ここはちょっと妥協して
#define membar() asm volatile("mfence":::"memory")
でいこうと思います。
これでもおせーんだよなぁって場合は工夫しないとなw
きっとまだ足りないはずだ
958デフォルトの名無しさん:2007/08/11(土) 01:35:23
条件が後から後からでてくる。いい流れだ。
959デフォルトの名無しさん:2007/08/11(土) 02:05:17
書き込みだけの場合は sfence とか読み込みだけの場合は lfence とか・・・
どの程度違うかわからんけどね。
960デフォルトの名無しさん:2007/08/12(日) 16:08:31
>x86では整列境界に沿ったワード操作はアトミックだが、
>全てのCPUがそうとは言い切れない。

>複数CPUの場合にはメモリバリアが必要なケースもあるし、
>更新された値の反映が遅れても構わないなら無くても問題にならない。
なんでやねん
961デフォルトの名無しさん:2007/08/12(日) 16:29:33
どの点が疑問なのか具体的に指摘してくれないと答えらんない
962デフォルトの名無しさん:2007/08/12(日) 16:49:28
おいおい、volatileでカンペキだろ?
963デフォルトの名無しさん:2007/08/12(日) 16:50:37
volatileはコンパイラに対するヒントでしかないので、完璧かどうか知る由もありません。
964デフォルトの名無しさん:2007/08/12(日) 16:50:52
C/C++ の volatile は全然カンペキじゃない。
965デフォルトの名無しさん:2007/08/12(日) 17:13:51
volatile で完璧かどうかはともかく、
volatile が単なるヒントだなんてことはない。
そんな信用ない実装だったら
メモリマップド I/O なんて危なっかしくて使えない。
966デフォルトの名無しさん:2007/08/12(日) 17:46:15
んにゃ、対象が外因によって変更される可能性があるから最適化の対象にするなというヒントでしかない。
アクセスごとに、外部との同期を取るような保証は全くないよ。
967デフォルトの名無しさん:2007/08/12(日) 17:47:58
>>966
ヒントじゃなくて強制だよ。
968デフォルトの名無しさん:2007/08/12(日) 18:28:15
同期を取る保証はないけど、最適化をしないという保証はある。
969デフォルトの名無しさん:2007/08/12(日) 18:57:36
お前らFPGAなんて使ったことねーからわからねーんだろ(笑)
役立たずは黙っててくれー
970デフォルトの名無しさん:2007/08/12(日) 19:00:03
>>969
専門知識があるやつ以外お断りなら専用スレ立ててそこでやれよ。
971デフォルトの名無しさん:2007/08/12(日) 19:31:23
>>969
FPGAなんか使ったことないよ。つーか、あんたはFPGAなんか使っているのかね。
972デフォルトの名無しさん:2007/08/12(日) 19:36:45
お前らシロウトなの?
毎秒270MBでデータが流れ込んでくるんだぞ
FPGAとはそういう世界
973デフォルトの名無しさん:2007/08/12(日) 19:52:29
>>972 だから何?
974デフォルトの名無しさん:2007/08/12(日) 19:53:00
もう触るなよ。
975デフォルトの名無しさん:2007/08/12(日) 19:53:23
ワードの読み書きがアトミックではないかも知れないと言いながら
反映が遅れてもいいなら問題ないって、そんなわけあるかい。
976デフォルトの名無しさん:2007/08/12(日) 19:56:00
そもそもアトミックに読み書き出来ないならメモリバリアでも足りない
977デフォルトの名無しさん:2007/08/12(日) 20:16:29
>>975
940はそんなこと言ってないが。
978デフォルトの名無しさん:2007/08/12(日) 20:28:28
あのなー
こっちはFPGAで270MB毎秒のデータを処理せにゃならんの
チマチマ排他なんかやってらんないの
わかんないかなー
979デフォルトの名無しさん:2007/08/12(日) 20:33:26
判らん。
なんで、高々270MiB/SecのデータごときでFPGA云々言わなきゃならんのか。
#FPGA使えることをよっぽど自慢したいのかな?
980デフォルトの名無しさん:2007/08/12(日) 20:47:18
FPGAなんて小さい会社でしか使わないけどな。
でかいところはASIC使うし。
981デフォルトの名無しさん:2007/08/12(日) 21:12:13
触るなってば。
982デフォルトの名無しさん:2007/08/12(日) 21:22:33
>>977
なるほど
983デフォルトの名無しさん:2007/08/12(日) 22:42:19
>>978
それをIntelさん相手に言ってあげてください
きっと驚いてしまうでしょう
984デフォルトの名無しさん:2007/08/13(月) 00:12:50
>>978
>こっちはFPGAで270MB毎秒のデータを処理せにゃならんの 
>チマチマ排他なんかやってらんないの 
>わかんないかなー 

でも、本当に多量のデータを処理してるのは石の方であって、
>>978 自身ではないと思うんだがなぁ。。。
985デフォルトの名無しさん:2007/08/13(月) 01:06:54
あのー978は俺じゃないよw
ちなみに普通のワークステーションでも処理できるけど
リアルタイムにデータ解析できるからFPGA使ってますよ
986デフォルトの名無しさん:2007/08/13(月) 01:56:14
987デフォルトの名無しさん:2007/08/13(月) 13:20:16
>>975
よく読め。条件次第の例を二つ出しただけだ。

上は特殊なCPUのケース、
下はメモリバリアの必要性も条件次第の意味。
988デフォルトの名無しさん:2007/08/13(月) 13:31:28
ところで、lock freeな配列リングバッファって実現されてんの?
連結リストな待ち行列しか見たことないんだけど。
989デフォルトの名無しさん:2007/08/13(月) 13:56:00
それってどういう動きするもんなの?
990デフォルトの名無しさん:2007/08/13(月) 14:04:40
つまり要領固定のブロッキングキューみたいなのか、
それともブロックしないものなのか…
991デフォルトの名無しさん:2007/08/13(月) 15:12:44
質問があります,
read/writeシステムコールってスレッドセーフ?
おんなじfdに複数スレッドでよってたかって書き込んでもOK?
順番は考慮しないものとして.
992988:2007/08/13(月) 15:26:25
Javaで言うBlockingQueueだとlock freeな意味ないから、
enqueue/dequeue出来ない場合はfalse/null返す感じの。

あんまり意味無さそうなんだけど、
>>885のやりたい事ってこれでしょ?

内側にlock freeな配列リングバッファ、
外側に条件変数使ったBlockingQueueを被せる感じ。

どのみちenqueue時にはdequeue待ちしているスレッドに
通知しなきゃいけないからlock freeの意味ないんだけど。
993デフォルトの名無しさん:2007/08/13(月) 15:27:39
>>991
一般的にはスレッドセーフ。
正確なところは使っているOSのマニュアル嫁。
994デフォルトの名無しさん:2007/08/13(月) 16:02:57
思いつきで書いてみた。動作確認はしてない。
public class LockFreeRingBuffer<E> {
int capacity;
AtomicReferenceArray array;
AtomicInteger head, tail, elements, spaces;
public LockFreeRingBuffer(int capacity) {
this.capacity = capacity;
array = new AtomicReferenceArray(capacity);
head = new AtomicInteger(0);
tail = new AtomicInteger(0);
elements = new AtomicInteger(0);
spaces = new AtomicInteger(capacity);
}
public boolean enqueue(E element) {
if (element == null) throw new NullPointerException();
for (;;) {
int n = spaces.get();
if (n == 0) return false;
if (spaces.compareAndSet(n, n - 1)) break;
}
int index = head.get();
while (!array.compareAndSet(index % capacity, null, element)) {
index++;
}
head.getAndIncrement();
elements.getAndIncrement();
return true;
}
995デフォルトの名無しさん:2007/08/13(月) 16:03:55
public E dequeue() {
for (;;) {
int n = elements.get();
if (n == 0) return false;
if (elements.compareAndSet(n, n - 1)) break;
}
int index = tail.get();
E element;
for (;;) {
element = array.getAndSet(index % capacity, null);
if (element != null) break;
index++;
}
tail.getAndIncrement();
spaces.getAndIncrement();
return element;
}
}
もうちょっと減らせないもんかな・・・
996デフォルトの名無しさん:2007/08/13(月) 16:19:04
そろそろ誰か次スレよろ
997988:2007/08/13(月) 16:49:43
spacesとelementsをそれぞれenqueue/dequeueの確定と扱ってるのか。
お互いに対になる要素数を最初と最後に更新して干渉を防いでるんだよね。

「空きがある or 要素がある」を先に確定した上で、
headとtailを対象要素の確定に先だったヒントして扱って
配列中の空要素への追加や有効要素の取得を行う、と。

配列要素の入れ替えあたりでモヤモヤが残る気がするんだけど、
これで良さそうな気もする。うまく説明出来ないんだけどさ。

この手のアルゴリズムの検証ってどうやってやってるんだろう?
998デフォルトの名無しさん:2007/08/13(月) 21:21:36
おーい、それでFPGAからの270MB毎秒のデータさばけるのかー?
そこんとこが大事なんだけど、分かってるかなー?
999デフォルトの名無しさん:2007/08/13(月) 21:34:07
よゆーよゆー^^
1000デフォルトの名無しさん:2007/08/13(月) 21:36:56
10011001
このスレッドは1000を超えました。
もう書けないので、新しいスレッドを立ててくださいです。。。