0

データ指向設計を使用してキャッシュを可能な限り効率的に使用するようにコードを方向付けようとしていますが、そのようなことについて考えるのは初めてです。画面上にスプライトを描画するのと同じ命令をループする方法を考案しました。この関数に送信されるベクトルには、すべてのゲーム エンティティの位置とスプライトが含まれます。

私の質問は、条件文が命令キャッシュから描画関数を取り除き、それによって私の計画を台無しにすることですか? それとも、私がしていることは一般的に非常識ですか?

struct position
{
    position(int x_, int y_):x(x_), y(Y_)
    int x,y;
};

vector<position> thePositions;
vector<sprite> theSprites;
vector<int> theNoOfEntities; //eg 3 things, 4 thingies, 36 dodahs
int noOfEntitesTotal;

//invoking the draw function
draw(&thePositions[0], &theSprites[0], &theNoOfEntities[0], noOfEntitesTotal)

void draw(position* thepos, sprite* thesp, int* theints, int totalsize)
{
    for(int j=0;int i=0;i<totalsize;i++)
    {
        j+=i%size[j]?1:0;
        thesp[j].draw(thepos[i]);
    }
}
4

2 に答える 2

1

条件がアセンブリの条件のままであることを確認しましたか? 一般に、上記のような単純な条件を使用すると、式を分岐のないシーケンスに最適化できます (マシン固有の命令を使用するマシン レベルで、またはファンシー ビット演算を使用する IR レベルで)。

あなたの場合、条件付きは x86 でフラットなシーケンスに非常にうまく折りたたまれます (そして、知る限り、これはほとんどの非 x86 プラットフォームでも発生します。これは、マシン固有のものではなく、数学的最適化であるためです):

IDIV DWORD PTR SS:[ARG.1]
MOV EAX,EDX
NEG EAX                                  ; Converts EAX to boolean
SBB EAX,EAX
NEG EAX

したがって、これは、パターンに従う外側のループを除いて、予測する分岐がないことを意味します。終了したので問題ありません)。

これは 2 番目のポイントをもたらします。決して想定しないで、常にプロファイルとテストを行います (アセンブリの知識が大いに役立つケースの 1 つです)。そうすれば、本当に重要な場所の最適化に時間を費やすことができます (そして、ターゲット プラットフォームのコードも改善されます)。

分岐の予測ミスとペナルティが本当に心配な場合は、ターゲット アーキテクチャの製造元が提供するリソースを使用してください (異なるアーキテクチャでは、分岐の予測ミスに対する動作が大きく異なります)。AMD の CodeAnalyst は、分岐予測ミスとそれが引き起こす可能性のあるペナルティをチェックするための優れたツールです。

于 2012-07-04T12:21:39.290 に答える
-1

おっ、相棒!悪気はありませんが、DOD について、その方法と理由を十分に理解せずに読んだようです。これで、国防総省に関する記事に記載されているガイドラインが重要であるかのように従っているだけです。そうではありません。国防総省で重要なのは、データを理解し、コンピューター アーキテクチャを理解し、アーキテクチャの知識を使用して、コードがそのデータを可能な限り効率的に操作する方法を理解することです。国防総省の記事に記載されているガイドラインは、考えるべき一般的な事項を思い出させるものとしてのみ掲載されています。

いつ、どのように DOD を使用する必要があるのか​​知りたいですか? 使用しているアーキテクチャについて学びます。1回のキャッシュミスのコストを知っていますか? それは本当に本当に本当に本当に低いです。計算する。私は真剣です、自分で計算してください。おそらくいくつかの数字を与えることができますが、それでは多くを学ぶことはできません. アーキテクチャ、プロセッサのしくみ、メモリとキャッシュのしくみ、アセンブリ言語のしくみ、コンパイラによって生成されたアセンブリがどのように見えるかについて調べてください。これらすべてを理解してしまえば、DOD は、本当に効率的なコードを作成するためのほぼ明白なガイドラインを述べているにすぎません。

于 2012-07-04T11:25:07.280 に答える