1

リダクションを使用して N 個の信号の平均値を計算する必要があります。入力はサイズ MN の 1D 配列で、M は各信号の長さです。

もともと、最初にデータをコピーして各信号を削減するための追加の共有メモリがありました。ただし、元のデータは破損しています。

私のプログラムは共有メモリを最小化しようとします。それで、レジスタを使用して N 信号の削減合計を行うにはどうすればよいか疑問に思っていました。N 個のスレッド、共有メモリ (float) s_m[N*M]、0....M-1 が最初のシグナルなどです。

N 個の異なる信号の平均値を格納するには、N 個のレジスタ (または 1 つ) が必要ですか? (マルチスレッドプログラミングと1つのレジスタを使用して順次加算を行う方法を知っています)。私がやりたい次のステップは、対応する信号の平均から入力のすべての値を減算することです。

4

2 に答える 2

3

問題は非常に小さいです (N = 32 および M < 128)。ただし、いくつかのガイドライン:

N 個のスレッドごとに N 個の値を削減していると仮定します。

  • N が非常に大きい (> 数万) 場合は、各スレッドで M を順次削減するだけです。
  • N が数十万未満の場合は、1 つのワープまたは 1 つのスレッド ブロックを使用して、N 回の削減のそれぞれを実行することを検討してください。
  • N が非常に小さく、M が非常に大きい場合は、N 削減ごとに複数のスレッド ブロックを使用することを検討してください。
  • N が非常に小さく、M が非常に小さい場合 (数値がそうであるように)、リダクションの入力/出力を生成および/または消費する計算も GPU で実行されている場合にのみ、リダクションに GPU を使用することを検討してください。
于 2012-09-10T06:24:35.217 に答える
-1

質問に対する私の理解に基づいて、N個の異なる信号の平均値を格納するためにN個のレジスタは必要ないと言います。

すでに N 個のスレッドがある場合 [各スレッドが 1 つのシグナルのみでリダクションを行う場合]、1 つのシグナルのリダクションを格納するために N 個のレジスタは必要ありません。必要なのは、平均値を格納するためのレジスタ 1 つだけです。

dim3 threads (N,1);
reduction<<<threads,1>>>(signals);  // signals is the [N*M] array 

__global__ reduction (int *signals)
{
   int id = threadIdx.x;
   float meanValue = 0.0;

   for(int i = 0; i < M; i++)
          meanValue = signals[id*M +i];

   meanValue =  meanValue/M;

   // Then do the subtraction
   for(int i = 0; i < M; i++)
          signals[id*M +i] -= meanValue;
}

N 個の異なる信号のすべての meanValues の一種のグローバル リダクションを実行する必要がある場合は、2 つのレジスタ [1 つはローカル平均を格納し、もう 1 つはグローバル平均を格納する] と共有メモリを使用する必要があります。

dim3 threads (N,1);
reduction<<<threads,1>>>(signals);  // signals is the [N*M] array 

__global__ reduction (int *signals)
{
   __shared__ float means[N];      // shared value
   int id = threadIdx.x;
   float meanValue = 0.0;
   float globalMean = 0.0;

   for(int i = 0; i < M; i++)
          meanValue += signals[id*M +i];

   means[id] =  meanValue/M;

   __syncthreads();

   // do the global reduction
   for(int i = 0; i < N; i++)
          globalMean += means[i];

   globalMean = globalMean/N;

   // Then do the subtraction
   for(int i = 0; i < M; i++)
          signals[id*M +i] -= globalMean;
}

これがお役に立てば幸いです。ご不明な点がございましたら、お知らせください。

于 2011-07-24T05:26:36.947 に答える