2012-02-09 2 views
-2

私はCUDAを初めて使用しています。異なる長さの異なるk個のメッセージを含むパケットを解析する効率的なカーネル関数を作成しようとしています。これは私がやったことです。可変数のメッセージを含むパケットを解析するためのCUDAカーネル関数

//head ----> pointing to a page locked memory i.e start of the packet 
//k -----> Number of messages in the packet 

host_func() 
{ 
    cudaHostGetDevicePointer(&d_dataPtr, head, 0); 

    int *h_bytes; 
    cudaHostAlloc((void**)&h_bytes, sizeof(int), cudaHostAllocWriteCombined | cudaHostAllocMapped); 
    *h_bytes = 0; 
    cudaHostGetDevicePointer(&d_bytes, h_bytes, 0); 

    kernel<<<1,26>>>(d_dataPtr, d_bytes, k); 
    cudaThreadSynchronize(); 
} 
__global__ void kernel(char *data, int *bytesProcessed, int *numOfMessages) 
{ 
    int temp = 0; 
    for(int i=0;i<*numOfMessages;i++) 
    { 
     switch(*data) 
     { 
      case 'A': 
      //do some processing 
      temp = sizeof(MessageA); 
      break; 

      case 'B': 
      //do some processing 
      temp = sizeof(MessageB); 
      break; 

      case 'C': 
      //do some processing 
      temp = sizeof(MessageB); 
      break; 
     } 
     data += temp; 
     *bytesProcessed += temp; 
    } 
} 

私は、データを解析することが可能だが、問題は、同じワープ内のスレッドは、このカーネルは非常に非効率的になり、同じメッセージタイプを処理しているです。スレッドを正しく同期させるための助けがあれば、大いに感謝します。

+0

実際の質問がありますか?私は1つを見ません..... – talonmies

+0

私は見ていないことはどういう意味ですか?私は、cudaカーネル関数を書くのが難しいです。 – gsm1986

+0

あなたは今見ていますか? – gsm1986

答えて

1

CUDAプログラムを効率的にするために、しばしば新しいアルゴリズムを発明する必要があります。良いCPUプログラムをGPUにコピーしても、それが速くなるわけではありません(速度が遅くなることさえあります)。 重要な要素の1つは、アルゴリズムの特定の部分が並列および独立したデータで動作できることです。画像処理または線形代数は、しばしばそのカテゴリに分類されます。

第2に、多くの計算を行う必要があります。ほんのわずかな条件と単純な算術演算では処理できません。処理を高速化した場合よりも、GPUにデータを転送するためにはるかに多くの費用がかかります。

(ビデオストリームでない限り)解析やストリーム処理では、これらのプロパティはどこにも表示されません。入力の次のバイトの意味は、すでに読んだ情報に大きく依存します。

通信プロトコルを変更できる場合は、一度に接続を開き、そこから独立したデータを読み取ることができます。しかし、GPUにはまだ多くの計算が必要です。そうでなければ、それは価値がありません。

関連する問題