私のカーネルスレッドは、線形文字配列に合体してアクセスします。配列 をテクスチャにマップするとスピードアップが表示されません。実行時間はほとんど同じで です。私は、計算能力2.0のTesla C2050に取り組んでいて、どこかにグローバルアクセスがキャッシュされているところで を読んでいます。本当?おそらくそれで私は の実行時間の違いを見ていないのです。CUDA:統合グローバルメモリに類似したテクスチャメモリのアクセス時間ですか?
メインプログラムの配列は
char *dev_database = NULL;
cudaMalloc((void**) &dev_database, JOBS * FRAGMENTSIZE * sizeof(char));
であり、私はそれが
cudaBindTexture(NULL, texdatabase, dev_database, JOBS * FRAGMENTSIZE * sizeof(char));
各スレッドは、次にID がthreadIdx.x + blockIdx.x * blockDim.x
とp
あるch = tex1Dfetch(texdatabase, p + id)
オフセットの文字を読み取るとtexture<char> texdatabase
をテクスチャに結合します。
私は一度だけ結合しており、dev_database
は大きな配列です。実際には私が見つけた サイズが大きすぎる場合、バインドに失敗します。バインドする配列 のサイズに制限はありますか?どうもありがとう。
ありがとうございます!あなたが与えたリンクはかなり役に立ちます。私のコードの分岐が分かれているように見えますが、今はそれらを削除しようとしています。任意のヒントをお待ちしております:) – Ross
どのように分岐分岐があなたのボトルネックであると判断しましたか?あなたが答えが正しいと思うならBTWはそれを受け入れてください。 – harrism
私は2つの方法でプログラムをタイムリーにしました。最初に、私はすべてのグローバルメモリの読み込みと測定時間をコメントしました。次に、グローバルメモリの読み込みをコメント解除し、if-else、測定時間などの説明をコメント化しました。最初の方法での時間は総時間とほぼ同じであり、後者ははるかに低かった。この方法を使用すると、発散を引き起こす正確なifステートメントを特定することができました。 – Ross