[過去ログ] 「数学」をプログラミングするには (1002レス)
前次1-
抽出解除 必死チェッカー(本家) (べ) 自ID レス栞 あぼーん

このスレッドは過去ログ倉庫に格納されています。
次スレ検索 歴削→次スレ 栞削→次スレ 過去ログメニュー
120: 2024/03/25(月)20:38 ID:0jQlcuCQ(1/2) AAS
>>104はVisual Studioでは最適化オプションがなぜか無視されてしまうが、コマンドライン
コンパイラではまさに>>109が言う要素数が固定かつ全要素がコンパイル時に計算可能という
特殊な場合に応じた最適化が施され、コンパイル時の計算結果を配列yに書き込むだけで
y = 2 * x を全く計算しないコードが生成されることが、アセンブリ出力から分かる。

IFORT (旧式Intel Fortran) では

 mov eax, 3
 (中略)
 mov DWORD PTR [TEST$X.0.1], 1
 mov DWORD PTR [TEST$X.0.1 + 4], 2
 mov DWORD PTR [TEST$X.0.1 + 8], eax
 mov DWORD PTR [TEST$Y.0.1], eax
 mov DWORD PTR [TEST$Y.0.1 + 4], 5
 mov DWORD PTR [TEST$Y.0.1 + 8], 7

というコードが生成され、Cの

 int t = 3;
 *x = 1; *(int *)((char *)x + 4) = 2; *(int *)((char *)x + 8) = t;
 *y = t; *(int *)((char *)y + 4) = 5; *(int *)((char *)x + 8) = 7;

に相当する処理になる (CではC流に添字0〜2を使うとして)。xとyに共通する
要素3はレジスタに入れて使い回される。一度も使われない変数xを除去する
最適化はされない。
121: 2024/03/25(月)20:38 ID:0jQlcuCQ(2/2) AAS
IFX (新式Intel Fortran) では

 movabsq $21474836483, %rax
 movq  %rax, TEST$Y(%rip)
 leaq  TEST$Y(%rip), %rax
 movl  $7, TEST$Y+8(%rip)

というコードが生成され (IntelのコンパイラなのAT&T記法で読みにくいが)、Cの

 *(long long *)y = 0x500000003;
 *(int *)((char *)y + 8) = 7;

に相当する処理 (リトルエンディアン環境で) になり、3と5がyに一度に書き込まれる。

いずれにしても、Ruby厨、Haskell厨の浅知恵でFortranに嚙み付いても滑稽なだけwww
前次1-
スレ情報 赤レス抽出 画像レス抽出 歴の未読スレ AAサムネイル

ぬこの手 ぬこTOP 0.040s