1

G-WAN KV オプションでKV_INCR_KEYは、1 番目のフィールドを主キーとして使用します。

つまり、このプライマリ インデックスを機能させるために、G-WAN コアに既に組み込まれているアトミックにインクリメントする関数があることを意味します。

この関数をサーブレットで使用できるようにオープンにする、つまり gwan.h に含めるとよいでしょう。

そうすることで、私のような ANSI C の初心者は恩恵を受けることができます。

4

2 に答える 2

1

これについては古い G-WAN フォーラムで十分な議論が行われ、プラットフォームごとに文書化された機能の豊富なリストを作成するために、アトミック操作の経験を共有するよう人々が招待されました。

アトミック操作は、CPU を直接アドレス指定するため、移植できません。これは、Intel x86 (32 ビット) と Intel AMD64 (64 ビット) のコードが異なることを意味します。各プラットフォーム (ARM、Power7、Cell、Motorola など) には、独自のアトミック命令セットがあります。

gwan.h基本的な操作は簡単に見つけることができるため ( GCC コンパイラーは C 拡張機能としていくつかのアトミック組み込み関数を提供します)、より高度な操作はあまり明白ではなく (スキルが必要ですasm)、人々は必要に応じてそれらを構築します -コード内の非常に特定の用途向け。

ソフトウェア エンジニアリングは常に、最小限のコストで利用できるもの (少数の機能を使用する G-WAN KV ストアなど) と、実際にどのように機能するか (従うのははるかに単純ではありません) との間のバランスです。 .

したがって、明白な (incr/decr、set/get) を超えて、アトミック操作についてさらに学び、Google を使用し、CPU 命令セットのマニュアルを見つけて、勇気を持って武装してください!

于 2012-11-09T12:59:32.750 に答える
0

ギルの有益なガイダンスに感謝します。
今、私は自分でそれを行うことができます。
以下のように、persistence.c のコードを変更します。
まず、 data の val の定義をvolatileに変更しました。

//data[0]->val++;  
//xbuf_xcat(reply, "Value: %d", data[0]->val);  
int new_count, loops=50000000, time1, time2, time;  

time1=getus();
for(int i; i<loops; i++){
    new_count = __sync_add_and_fetch(&data[0]->val, 1);
}
time2=getus();

time=loops/(time2-time1);
time=time*1000;

xbuf_xcat(reply, "Value: %d, time: %d incr_ops/msec", new_count, time);

古い E2180 CPU で 52,000 incr_operations/msec を得ました。
したがって、GCC コンパイラを使用すると、自分で実行できます。
再度、感謝します。

于 2012-11-12T04:40:44.800 に答える