私は、それぞれ64ビット長の8つのビットベクトルを含むデータ構造を持っています。しかし、これらの配列の個々のバイトは、順番に並べるのではなく、データ構造全体にインターリーブされ、与えられたビットベクトルの各連続するバイトは、前のバイトの後の8バイトです。現代のx86-64 CPUでは、インターリーブされたこれらのアレイと64ビットワードの間でデータを移動するための効率的な方法(パラレルロードやストアなど)はありますか?組み込みのasmを使用したCコードはうまくいきますが、gcc組み込み関数を使用するソリューションがあれば、それはさらに優れています。インターリーブアレイを読み書きする方法は?
0
A
答えて
0
私はそのようなインターリーブされたデータで動作するx64 CPU命令を認識していません。しかし、これらのCPUは、シフトおよびI/O、私は8インライン化シフト/コピー操作で、次のアプローチを使用して、オプティマイザに残りの仕事を残したいインデックス化にかなり速いですので、:
void Write (unsigned char* bytes,
unsigned long long value,
int offset)
{
bytes [offset ] = (unsigned char) (value );
bytes [offset + 8] = (unsigned char) (value >> 8);
bytes [offset + 16] = (unsigned char) (value >> 16);
bytes [offset + 24] = (unsigned char) (value >> 24);
bytes [offset + 32] = (unsigned char) (value >> 32);
bytes [offset + 40] = (unsigned char) (value >> 40);
bytes [offset + 48] = (unsigned char) (value >> 48);
bytes [offset + 56] = (unsigned char) (value >> 56);
return;
}
void Read (unsigned char* bytes,
unsigned long long* value,
int offset)
{
*value = ((unsigned long long) bytes [offset ] ) |
((unsigned long long) bytes [offset + 8] << 8) |
((unsigned long long) bytes [offset + 16] << 16) |
((unsigned long long) bytes [offset + 24] << 24) |
((unsigned long long) bytes [offset + 32] << 32) |
((unsigned long long) bytes [offset + 40] << 40) |
((unsigned long long) bytes [offset + 48] << 48) |
((unsigned long long) bytes [offset + 56] << 56);
return;
}
このコードを格納リトルエンディアン順の64ビット値ビッグエンディアンの場合、逆の順序でバイトを読み書きします。
関連する問題
- 1. HashMapを使ってファイルを読み書きする方法は?
- 2. NSArrayを読み書きする方法は?
- 3. Linuxカーネルモジュール内でファイルを読み書きする方法は?
- 4. vb.netでテキストファイルを読み書きする方法は?
- 5. アンドロイドのActivityThreadからファイルを読み書きする方法は?
- 6. Kohana 3.1のログディレクトリを読み書きする方法は?
- 7. テキストファイルを読み書きする方法は?
- 8. ssisスクリプトコンポーネントで変数を読み書きする方法は?
- 9. データをファイルに読み書きする最速の方法は?
- 10. 書き込み、読み込み、追加の方法は?
- 11. Xmlでの読み書き方法
- 12. J2ME/Blackberry - テキストファイルの読み書き方法?
- 13. シリアルポートの読み書き方法
- 14. C++ Boost ASIO:タイムアウトで読み書きする方法は?
- 15. データベースにスレッドで安全に読み書きする方法は?
- 16. xmlファイルで読み書きを分ける方法は?
- 17. jQueryを使ってNVDAスクリーンリーダーを読み書きする方法
- 18. PHPを使用してXMLを読み書きする方法
- 19. ドッカーボリュームへの書き込み/読み取りアクセスを処理する方法は?
- 20. 画像とテキストをFirebaseリアルタイムデータベースに読み書きする方法
- 21. SparkからDataFrameを読み書きする方法
- 22. pandasとsqlalchemyをchunkwiseで読み書きする方法
- 23. NSStreamsからintsを読み書きする方法
- 24. Javascriptでファイルを読み書きする方法
- 25. クラスを保存して読み書きする方法
- 26. ブラックベリーデバイスから写真を読み書きする方法
- 27. C#UWA(Universal Windows App)でファイルを読み書きする方法
- 28. C#のテキストファイルに日付を読み書きする方法
- 29. PythonでCSVファイルを読み書きする方法
- 30. flinkストリーミングジョブでHBaseを読み書きする方法
これを達成するにはいくつかの興味深いテクニックがあるかもしれませんが、いくつかのサンプルデータと、達成したい結果の最適化されていないバージョンであっても、それが立っているので、細部を知らなくても非常に広い質問です。 –
これを行う巧妙な方法があるかもしれませんが(VPSHUFBは心に浮かんでいます)、このデータをたくさん読み込んでいない限り、それらを書き、テストする時間と努力があなたを大幅に節約することはほとんどありません。 SBSのソリューションは、AVX2やAVX512BWを使ってasmで書かれたものほどセクシーではないかもしれませんが、はるかに移植性と保守性に優れています。これがあなたのコードでパフォーマンスのボトルネックにならない限り、私はシンプルでシンプルに投票します。 –