2010-12-07 8 views
2

私はCUDAを使用して小さなアプリケーションを開発しています。
私は巨大な2d配列(共有メモリには収まらない)を持っています。すべてのブロックのスレッドは常にランダムな場所から読み込みます。
この2d配列は読み取り専用配列です。
この2d配列はどこに割り当てられますか?グローバルメモリ?定数memroy?テクスチャメモリ?Cuda異なるメモリ割り当て

+0

私は確信していますが、ランダムな読み込みはCUDAを適用するのに最適な場所ではありません。テクスチャは空間の局所性に最適化されていますが、読み込みがランダムであれば空間的な局所性はありません。これに基づいて、私はグローバルに行くだろう...しかし、あなたは、アクセスパターンに基づいてCPUの実装よりもスピードアップを見ないかもしれません。 – Marm0t

答えて

2

デバイスのテクスチャメモリのサイズに応じて、この領域に実装する必要があります。確かに、テクスチャメモリは、順次ローカリティキャッシュ機構に基づいている。これは、連続した識別子のスレッドが比較的近い記憶場所内のデータ要素に到達しようとすると、メモリアクセスが最適化されることを意味します。
さらに、この地域は2Dアクセスのために実装されています。したがって、各スレッドがテクスチャメモリに格納された配列のデータ要素に到達すると、連続した2Dアクセスの場合になります。その結果、メモリアーキテクチャを最大限に活用できます。

このメモリはそれほど大きくはありません。巨大な配列を使用すると、データをその中に収めることができます。この場合、グローバルメモリの使用を避けることはできません。

+0

質問は具体的に...「ランダムな場所」です。これはキャッシュのための良いニュースではありません! – jmilloy

+0

もちろん、キャッシュミス時にのみデバイスメモリからの読み込みに相当するコストがかかるため、データをテクスチャメモリに入れる価値があると簡単に考えることができます!したがって、ランダムアクセスでも、キャッシュされた要素に確実にアクセスし、テクスチャキャッシュの恩恵を受けるでしょう。 – jopasserat

0

それが一定またはテクスチャに収まるのに十分小さい場合は、私は3つ全てを試みます。

ここに記載されていない興味深いオプションは、ホスト上のマップされたメモリです。デバイスメモリに明示的に転送することなく、デバイスからアクセス可能なホスト上のメモリを割り当てることができます。アクセスする必要のある配列の量に応じて、グローバルメモリにコピーしそこから読み取るよりも高速である可能性があります。

1

私はjHackTheRipperに同意します。単純な解決策は、テクスチャメモリを使用し、Compute Visual Profilerを使用してプロファイルすることです。画像畳み込みのために異なるメモリタイプについてのgood set of slides from NVIDIAがあります。それは良い共有メモリ使用量とグローバル読み取りがテクスチャメモリを使用するよりもあまり速くないことを示しています。あなたの場合は、グローバルメモリのランダムな値にアクセスすることで通常得られないテクスチャメモリからいくつかの合体した読み込みを得るべきです。

+0

いいね!再び、使用されるアーキテクチャに応じて:非融合アクセスは、コンピューティング機能2.0(Fermi)のデバイスでメモリ性能に及ぼす影響は小さくなります。 – jopasserat

+0

しかし、Compute 1.0用に最適化されたコードを書くと、スピードが2.0倍に向上します – Ljdawson