2

C で関数の偏導関数を作成しています。このプロセスは、主に多数の小さなループで構成されています。各ループは、行列の列を埋める役割を果たします。行列のサイズが非常に大きいため、コードは効率的に作成する必要があります。詳細には触れたくない実装の計画がいくつかあります。

スマート コンパイラがキャッシュを自動的に利用しようとすることはわかっています。しかし、キャッシュを使用して効率的なコードと効率的なループを作成する方法の詳細を知りたいです。いくつかのリソースまたは Web サイトを提供していただければ、メモリ アクセス時間を短縮し、guy を活用するという点で効率的なコードを記述する方法について詳しく知ることができます。

私の要求がずさんに見えることはわかっていますが、私はコンピューターの男ではありません。いくつかの調査を行いましたが、成功しませんでした。だから、どんな助けも大歓迎です。

ありがとう

4

2 に答える 2

5

適切に記述されたコードは効率的である傾向があります (ただし、常に最適であるとは限りません)。適切でクリーンなコードを作成することから始めてください。パフォーマンスの問題が実際にある場合は、分離して対処してください。

于 2013-03-02T06:36:46.497 に答える
2

最も読みやすく理解しやすい方法でコードを記述し、それをプロファイリングしてボトルネックが実際にどこにあるかを確認するのがおそらく最善の方法です。多くの場合、どこで効率化が必要かという概念が現実と一致しません。

最新のコンパイラは、最適化の多くの側面でまともな仕事をしており、ループのプロセス自体が問題になることはほとんどないようです。おそらく、各ループで実行される計算を単純化することに焦点を当てることを検討する必要があります。

それ以外の場合は、行列に行ごとにアクセスして、C が使用する行優先のストレージ順序を利用するなどのことを検討することになります (この質問を参照してください)。

if ステートメントはいわゆる「分岐」を作成するため、ステートメントを使用forせずにループを構築する必要があります。ifコンピューターは基本的に、どのオプションが正しいかを推測し、それが間違っている場合は多額のオプションを支払います。

そのテーマを拡張するには、for ループ内での処理をできるだけ少なくする必要があります。また、静的制限で定義することもできます。たとえば、次のようになります。

for(int i=1;i<100;i++) //This is better than
for(int i=1;i<N/i;i++) //this

静的制限とは、for ループを続行するかどうかを判断する労力がほとんどかからないことを意味します。また、OpenMPを使用してループ内の作業を分割することもできます。これにより、処理が大幅に高速化される場合があります。これは簡単です:

#pragma omp parallel for
for(int i=0;i<100;i++)

そして、ワラ!コードは並列化されています。

于 2013-03-02T06:38:07.697 に答える