謎が深い…

fgo福袋が爆死 & やたら重かったので、バンディング低減のAVX512版を作ってみようとしたのだけど…

VC++2017の出力が謎…。

とりあえず、こんなコードがあったとします。


int main(int argc, char **argv) {
alignas(64) int16_t a[32];
alignas(64) int16_t b[32];

//適当に初期化
for (int i = 0; i < 32; i++) {
a[i] = rand() % INT16_MAX;
b[i] = rand() % INT16_MAX;
}
//ロード
__m512i z0 = _mm512_load_si512((__m512i *)(a));
__m512i z1 = _mm512_load_si512((__m512i *)(b));

//マスクを作るよ
__mmask32 mBlend = _mm512_cmpgt_epi16_mask(z0, z1);

//マスクを使うよ
__m512i z2 = _mm512_mask_mov_epi16(z0, mBlend, z1);

_mm512_storeu_si512((__m512i*)a, z2);

//最適化で全体が消されないようになんか出力しとく
printf("%d\n", a[0]);

return 0;
}

まあ、マスクを使いたいだけの簡単なコード…のはず。

これをVC++2017 (15.5.2)で32bitプログラムとしてコンパイルして、逆アセンブラのAVX512部分をみるとこんな感じになる…。


vmovdqa32 zmm0, ZMMWORD PTR _b$[esp+256]
vmovdqa32 zmm1, ZMMWORD PTR _a$[esp+256]

vpcmpw k1, zmm1, zmm0, 6
kmovd eax, k1
kmovd k1, eax
vmovdqu16 zmm1 {k1}, zmm0

vmovdqu32 zmm0, zmm1
vmovd eax, xmm0
この5行目と6行目はなんぞ? なぜ汎用レジスタに移して戻したし。
あと9行目も何がしたいのやら…。

一応、Function compile flags: /Ogtpyとなっているので、最適化はかかっているはず。

ちなみにg++(7.2.0) -O3 -mavx512f -mavx512bw -S -masm=intelだと、

vmovdqa64 zmm1, ZMMWORD PTR [esp+80]
mov DWORD PTR [esp], OFFSET FLAT:LC0
vmovdqa64 zmm0, ZMMWORD PTR [esp+16]
vpcmpgtw k1, zmm0, zmm1
vmovdqu16 zmm0{k1}, zmm1
vpextrw eax, xmm0, 0
やっぱいらないよねえ…。

決して間違った結果にはならないし、完璧に最適化しろというわけではないけど、さすがにもう少しうまくやってほしい…。それともなにか見落としているのだろうか?

うーん。どうしたものか。あまり気にしなくてもいいのかなあ…。
スポンサーサイト

コメントの投稿

非公開コメント

No title

関係あるかわかりませんがDoom9のAvisynth+スレで
VS2017 15.5.1/15.5.2の生成コードがおかしいという話が出てました。

https://forum.doom9.org/showthread.php?t=168856&page=192

No title

なるほど、最適化回りがなにかおかしいのかもですね…。

1次、2次、3次とキャッシュあるから

ド素人の戯言なのですがflag処理してたり、キャッシュの処理をしてたりとかかなぁと思ったりしました
あくまでも戯言ですので、既にお考えだと思いますがお許しを

Re: 1次、2次、3次とキャッシュあるから

確かにマスクレジスタは新しい機能なので、なにか特殊な最適化とかが必要なのかもしれませんね。

マスクレジスタ用のshift命令は遅いみたいな話も聞きますし…。

誰も導入にツッコミを入れないのか…
プロフィール

rigaya

Author:rigaya
アニメとか見たり、エンコードしたり。
連絡先(@を半角にしてください!)
rigaya34589@live.jp
github

最新記事
最新コメント
カテゴリ
月別アーカイブ
カウンター
検索フォーム
いろいろ
公開中のAviutlプラグインとかのダウンロード

○Aviutlプラグイン
x264guiEx 2.xx (ミラー)
- x264を使用したH264出力
- x264guiExの導入>
- x264.exeはこちら>

x265guiEx (ミラー)
- x265を使用したH.265/HEVC出力
- x265.exeはこちら>

QSVEnc + QSVEncC (ミラー)
- QuickSyncVideoによるH264出力
- QSVEncCはコマンドライン版
- QSVEncC 導入/使用方法>
- QSVEncCオプション一覧>

NVEnc + NVEncC (ミラー)
- NVIDIAのNVEncによるH264出力
- NVEncCオプション一覧>

VCEEnc + VCEEncC (ミラー)
- AMDのVCEによるH.264出力

ffmpegOut (ミラー)
- ffmpeg/avconvを使用した出力

自動フィールドシフト (ミラー)
- SSE2~AVX2による高速化版
- オリジナル: aji様

エッジレベル調整MT (ミラー)
- エッジレベル調整の並列化/高速化
- SSE2~AVX対応
- オリジナル: まじぽか太郎様

バンディング低減MT (ミラー)
- SSE2~AVX2による高速化版
- オリジナル: まじぽか太郎様

PMD_MT (ミラー)
- SSE2~FMA3による高速化版
- オリジナル: スレ48≫989氏

透過性ロゴ (ミラー)
- SSE2~FMA3によるSIMD版
- オリジナル: MakKi氏

AviutlColor (ミラー)
- BT.2020nc向け色変換プラグイン
- BT.709/BT.601向けも同梱

○その他
x264afs (ミラー)
- x264のafs対応版

aui_indexer (ミラー使い方>)
- lsmashinput.aui/m2v.auiの
 インデックス事前・一括生成

auc_export (ミラー使い方>)
- Aviutl Controlの
 エクスポートプラグイン版
 エクスポートをコマンドから

aup_reseter (ミラー)
- aupプロジェクトファイルの
 終了フラグを一括リセット

CheckBitrate (ミラー, 使い方, ソース)
- ビットレート分布の分析(HEVC対応)

チャプター変換 (ミラー使い方>)
- nero/appleチャプター形式変換

エッジレベル調整 (avisynth)
- Avisynth用エッジレベル調整

メモリ・キャッシュ速度測定
- スレッド数を変えて測定

○ビルドしたものとか
L-SMASH (ミラー)
x264 (ミラー)
x265 (ミラー)

○その他
サンプル動画
その他

○読みもの (ミラー)
Aviutl/x264guiExの色変換
動画関連ダウンロードリンク集
簡易インストーラの概要

○更新停止・公開終了
改造版x264gui
x264guiEx 0.xx
RSSリンクの表示
リンク
QRコード
QR