2012-02-17 20 views
8

私はOpenLCLでアルゴリズムを書いていますが、かなりの量のデータを記憶する必要があります。long[70]long[200]かそれ以上のカーネルがあります。AMDデバイス上の物理メモリ:ローカル対プライベート

最近のAMDデバイスには32 KiB __localメモリがあります。これは、20〜58個の作業単位の情報を格納するのに十分な量です(カーネルあたりの所与のデータ量)。しかし、私がアーキテクチャから理解しているもの(特にthis drawing)から、各シェーダコアには専用メモリが専用に用意されています。私はしかし、そのサイズを見つけることに失敗します。

各カーネルが持つプライベートメモリの量を知る方法を教えてもらえますか?

私は特にこれらのいくつかをすぐに購入する予定であるので、私はHD7970について特に興味があります。

編集:問題解決、答えは付録のhereあるD.

+2

私は、プライベートメモリがコアごとに専用されているとは思っていません。演算子リソースごとのレジスタファイルにマップされています。各作業項目は、計算ユニットレジスタファイルから割り当てられたレジスタを取得します。必要な数は、任意の瞬間における飛行中の波面の数を決定します。 – talonmies

+0

有名などこからでも見た図http://www.codeproject.com/KB/showcase/Memory-Spaces/image001.jpg私はプライベートメモリが__localメモリとは物理的に異なっていると結論付けました。 – user1111929

+2

はい、物理的に異なります。プライベートメモリは、最新のAMDデバイスのユニットレベル共有メモリを計算するためのローカルメモリである計算ユニットレジスタファイルにマップされます。いくつかの初期のOpenCL互換GPUにはダイ共有メモリがなく、ローカルメモリは単なるSDRAMでした。コアごとではなく、ローカル・エフェクトのワークグループごとにワークアイテムごとにどれだけ使用するかは、計算単位ごとに実行される同時波面の数です。 – talonmies

答えて

4

コメントはユーザーの嫌悪感によってコメントに書かれていますので、私は質問を閉じるためにここで新しい答えに書きます。

これらの値は、AMD APP OpenCLプログラミングガイドhttp://developer.amd.com/sdks/amdappsdk/assets/amd_accelerated_parallel_processing_opencl_programming_guide.pdfの付録Dに記載されています(nVidiaにも同様のドキュメントがあります)。明らかに、レジスタはAMDデバイス用に128ビット(4x32)であり、すべての最新のハイエンドデバイス用に16384個のレジスタがあるため、計算単位あたり256KBという顕著なものです。

0

私はあなたが__localメモリーを探していると思います。これが、32KBのローカルデータストレージが参照しているものです。私はあなたが私的なメモリ量を得るためにデバイスをポーリングできるとは思わない。

NULLの長い* cl_mem参照を渡して、メモリを割り当てることができます。私は、WIごとに静的な量のメモリを使用することが最善であると思います。各作業項目に長い[20​​0]が必要であると仮定すると、以下のコードを使用します。 LDSメモリを最大限に活用するために、同じ(または同様の)メモリ要件を持つグループに作業を分けることも良い考えです。

void __kernel(__local long* localMem, const int localMemPerItem 
     //more args... 
     ) 
{ 
    //host has 'passed' localMemPerItem*get_local_size() long values in as locamMem 
    //this work item has access to all of it, but can choose to restrict 
    //itself to only the portion it needs. 
    //work group size will be limited to CL_DEVICE_LOCAL_MEM_SIZE/(8*localMemPerItem) 
    int startIndex=localMemPerItem*get_local_id(0); 
    //use localMem[startIndex+ ... ] 
} 
+1

ポーリングできませんが、存在しますか?有名なあらゆる場所から見た図http://www.codeproject.com/KB/showcase/Memory-Spaces/image001.jpg私は、各作業単位に物理的に別個のプライベートレジスタのセットがあると仮定しました。いいえ?私は何とかCL_DEVICE_LOCAL_MEM_SIZE /(8 * localMemPerItem)の制限よりもうまくいくことを望んでいました。大域メモリへのアクセスは、たとえカウンタをインクリメントするだけであっても、おそらく遅すぎるでしょう。 – user1111929

+1

私はサイプレス、ケイマン、フェルミのレジスタサイズに関する情報をここで見つけました:http://www.realworldtech.com/page.cfm?ArticleID=RWT121410213827&p=11あなたは、ある程度の大きさのプライベートバースをそのサイズに調整する必要があります。私はLDSはまだあなたの最善の策だと思う。 – mfa

0

そのGCNアーキテクチャに基づいて、それはアナンドテックでイメージどおり64キロバイトであることから、の79xxシリーズのカードにファイルを登録する方法を大に答えるために:http://www.anandtech.com/print/5261

方法を見つけるためにどのようにあなたの質問に答えるためにあなたがカーネルでAMD APPプロファイラを実行するのを見ることができます。それは、カーネルがどのくらいのスペースを利用しているかをカーネル占有セクションで教えてくれます。

+0

本当ですか?それは変だ。私は答えを見つけたと思ったが、それは別のものだ。付録DのAMD OpenCLプログラミングガイドhttp://developer.amd.com/sdks/amdappsdk/assets/amd_accelerated_pa​​rallel_processing_opencl_programming_guide.pdfには、レジスタファイルの合計サイズがあり、現代のすべてのデバイスで256KBと表示されています。どちらが正しい? :S – user1111929

+0

私は両方が正しいと信じています。私が理解しているように、GCNアーキテクチャでは、1つのSIMDユニットには64KBのレジスタファイルがあり、演算ユニットごとに4つのSIMDユニットがあります。 4 * 64kb =演算単位ごとの合計レジスタファイルの256kb。 – talonmies

関連する問題