6

float の巨大な配列を含むオブジェクトを使用する Java プログラムがあります。最適化の理由から、このコードの一部を C に変換する必要があります。

ベンチマークのために、目的のメソッドを C で既に変換しました。オブジェクトを入力として受け取る代わりに、それらの float 配列を受け取るようになりました。

C コードから簡単にアクセスできるように、これらの配列を Java のファイルに保存しました。問題は、Java の浮動小数点数と C の浮動小数点数が明らかに完全に異なることです。C コードでダミーの値が取得されます。

この作業に役立つ情報源をインターネット上で見つけられませんでした。 これは見つかりましたが、C++ 用であり、それらのクラスにアクセスできません。

何か提案はありますか?ある種のコンバーターを開発できると思いますが、時間がかかる場合があり、おそらくオンラインでより良い解決策があるでしょう。

どうも、

編集 :

DataOutputStream とその writeFloat メソッドを使用して float 配列を保存しています。

4

2 に答える 2

5

GPU を直接使用するには、JavaCL または JavaCV を使用します。

注: これらのライブラリは Intel/AMD CPU でも動作するため、高速でない場合は GPU を使用する必要はありません。

ところで:JavaとCのfloatは同じです。ただし、ObejctOutputStream を使用する場合、これは Java によってのみ読み取ることができ、DataOutputStream を使用する場合、データはビッグ エンディアン形式になります。リトル エンディアンの Intel/AMD CPU を使用している場合は、バイトを交換する必要があります。

ByteBuffer と NIO を使用してデータを書き込む場合、ビッグ エンディアンまたはリトル エンディアンにすることができます。後者は翻訳を必要としません。

float[]注: JNI 経由でまたはにアクセスできます。FloatBufferつまり、ファイルに書き込む必要はありません。

FloatBuffer を使用するには、お勧めします

FloatBuffer fb = ByteBuffer.allocateDirect(size*4)
                           .order(ByteOrder.nativeOrder())
                           .asFloatBuffer();
于 2012-10-10T07:18:54.053 に答える
3

まず、C: project RootBeerに変換せずに Java プログラムを GPU で実行できます。

次に、Java フロートは C フロートと同じです。コツは、それらを正しく読み書きすることです。フロートを読み書きするメソッドを持つFileChannelByteBufferを使用することをお勧めします 。バイト オーダーに注意してください。ByteBuffer には、目的の順序を設定するメソッドがあります。

于 2012-10-10T07:18:16.927 に答える