1

たとえば、単純な定数変数__device__ __constant__ int MY_CONSTANT;があり、同じカーネル スレッドによって複数回アクセスされる場合:

__global__ void move(int* dataA, int* dataB, int* dataC){
    ...
    dataB[threadID] = dataA[threadID] * MY_CONSTANT;
    dataC[threadID] = dataA[[threadID] * dataB[threadID] % MY_CONSTANT;
    ...
}

不必要なグローバル読み取りを避けるために、 および の値をローカル変数/レジスタにdataA[threadID]格納すると有益であることがわかります。dataA[threadID] * MY_CONSTANTそれを無視すると、 の値をMY_CONSTANTローカル変数に入れて 2 回読み取られるのを避けることが有益でしょうか。それとも、他のグローバル データとは異なり、変更できないことを考えると、これはコンパイラによって処理されるでしょうか。

4

1 に答える 1

0

確かに、それを知る唯一の方法は、それぞれの方法でコードを作成し、次のことを行うことです。

  1. PTX コードを生成して調べ、コンパイラが各実装に対して何を出力するかを判断します。
  2. 代表的な入力を使用して、各実装とテストのパフォーマンスを計測およびプロファイルします。

あなたが求めているのは、「時期尚早の最適化」というフレーズを正当化する一種のマイクロ最適化です。パフォーマンスがニーズに対して不十分であることが判明しない限り、この種の最適化は忘れることをお勧めします。

そうは言っても、定数メモリはグローバルメモリ空間に格納され、マルチプロセッサによってアクセスされるとキャッシュに追加されます。このメモリ領域への後続のアクセスでは、レイテンシが大幅に短縮されます。ワープ内のすべてのスレッドが定数メモリの同じワードにアクセスする場合、競合は発生せず、とにかくすべてがかなり迅速に行われます (ハードウェアは大きく異なることに注意してください。私が言っていることは、お使いのデバイスでは技術的に正確ではないかもしれませんが、要点は次のとおりです。メモリ型のアクセス パターンに従ってください。ここで求めている種類のことについて心配する必要はありません)。

于 2013-01-08T19:16:58.723 に答える