2016-05-13 5 views
0

OpenCLについて次のコードを実行しようとしています。カーネル関数では、私はその後、私はカーネルを実行するNスレッドを作成しますint arr[1000] = {0};OpenCL変数またはカーネルコストメモリ内の配列?

kernel void test() 
{ 
    int arr[1000] = {0}; 
} 

配列を定義します。

cl::CommandQueue cmdQueue; 
cmdQueue.enqueueNDRangeKernel(kernel, cl::NullRange, cl::NDRange(N), cl::NullRange); // kernel here is the one running test() 

私たちはOpenCLのは、スレッドを実行平行になることを知っているので、私の質問は、それがピークメモリはN * 1000 * sizeof(int)になる、という意味ではないですか?

+0

スタックスペースはどうですか? –

答えて

0

これはOpenCLへの道ではありません(そうです、それは私の意味です:)。

カーネル関数は、ホスト(CPU)から渡されたカーネルオペランドにを運営 - あなたはclCreateBufferを使用してホスト上の配列を割り当て、clSetKernelArgを使用して引数を設定すると思います。あなたのカーネルはデバイスメモリを宣言/割り当てしませんが、単純に__global引数として受け取ります。今度はclEnqueueNDRangeKernelを使ってカーネルを実行すると、OpenCLの実装は1000のintを割り当て、それらのintのそれぞれにスレッドを実行します。

一方、作業項目(デバイススレッド)ごとに1000の整数を割り当てることを意図していた場合、計算は正しいです(はい、ローカルプールからのメモリが必要です)が、おそらく動作しません。 OpenCLワークアイテムは、ローカルメモリにのみアクセスできます(このデバイスのチェック方法については、hereを参照)。これは厳しく制限されています。

+0

私は後者を意味すると思います。つまり、各スレッドに1000のintを割り当てます。配列は各スレッドのプライベート変数なので、そうですか?だから私は理論的にN * 1000 * sizeof(int)のメモリコストが最大であると思う。 –

+0

はい、正しいです。 – Ani

+0

N * 1000 * sizeof(int)ではなく、M * 1000 * sizeof(int)になります。ここで、Mはローカルワークグループのサイズで、指定されなかったためランタイムまでです。 – Dithermaster

関連する問題