0

CSのバックグラウンドを持たない人(私の専攻は応用数学です)にとって、asm言語は急な学習曲線になりますか?

通常、C / C ++などの高級プログラミング言語に精通している人が、線形回帰や1D直交多項式計算など、少なくともいくつかの要素数学計算を実行できるasmプログラムを作成するのにどのくらい時間がかかりますか?

ところで、現代のasmは次のようないくつかの機能をサポートしていますか?

  • SIMD命令を使用した数学演算

  • マルチスレッドとスレッド制御

そして通常、最新の最適化コンパイラを使用してC / C ++ではなくasmでこれを行うことで、パフォーマンスが大幅に向上しますか?

4

2 に答える 2

4

ASM は通常、ほとんどの人にとってかなり難しいと考えられています。しかし、それは論理的に単純明快であり、応用数学のバックグラウンドを持つ人が問題を抱えているとは思いません.

アセンブリでは、プロセッサがどのように機能するかを理解する必要があります。なぜなら、asm をコーディングするときは、最終的に最も基本的な方法でプロセッサを操作することになるからです。

このことを考慮:

if (val)goto next;

次の限り、何かに変換されます。

mov eax, [val]
cmp eax, 0
je next

本質的に、アセンブリでは、プログラムがプロセッサを使用してタスクを実行する方法を理解する必要があります。EG: レジスタ (eax など) の必要性と使用方法。

一般に、C よりも asm の方が処理に時間がかかります。詳細については、わかりません。

最新の命令セットの中には、新しい数学演算を提供するものがありますが、それはあなたの求めるものかもしれませんし、そうでないかもしれません。マルチスレッドなどはオペレーティング システムの役割であり、プロセッサとは関係ありません。したがって、アセンブリには何も関係ありません (これは厳密には当てはまりません。ハードウェア マルチタスクは存在しますが、めったに使用されませんが、余談です)。

通常、最適化に多くの時間を費やす小さな反復的なコードを作成しない限り、最適化された C/C++ よりも ASM を作成してもパフォーマンスはほとんど向上しません。

于 2012-12-09T10:37:17.440 に答える
1

また、最新の最適化されたコンパイラを使用して C/C++ の代わりに asm でこれを行うと、通常、パフォーマンスが大幅に向上しますか?

いいえ。

各 asm 命令は HLL ステートメントより単純であるため、同じ機能を実装するにはより多くの asm 命令が必要です。アセンブリでの書き込みには、レジスタの数が少ないなど、さらに複雑な問題があります。

さらに、アセンブリを記述して同じことを実現する方法は多数あります。たとえば、mov eax,0どちらもレジスタにxor eax,eaxゼロを書き込みますeaxが、一方は他方よりも高速です。さらに、asm 命令のシーケンスは、実行速度に違いをもたらします。いくつかの CPU パイプラインをビジー状態に保つために一致する場合、明白ではない、またはより長い命令シーケンスがより高速になる可能性があります。

最適なアセンブリを記述することは計算集約的です: サイクルカウント、パイプラインの説明などに基づいて、さまざまな可能性にかかる時間を計算します。そのような計算は最適化コンパイラによって行われます。あなたができるより。

http://www.amazon.com/Zen-Code-Optimization-Ultimate-Software/dp/1883577039は非常に興味深い読み物ですが、本の終わりまでに、Pentium クラスの CPU について話し始めているので、次のことができます。最適なアセンブリの記述が複雑になっていることがわかります。


コンパイラの出力に満足できない場合は、より優れたコンパイラを入手することを検討してください。たとえば、Intel のコンパイラは、他の多くのコンパイラよりも最適化された (または少なくとも生成に使用された) コンパイラを生成し、特定の CPU、異常なオペコードに対するより優れたサポートを含んでいます。 、おそらくより優れたランタイムライブラリなどがあります。

于 2012-12-09T10:51:55.783 に答える