私は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;
}
}
私は、データを解析することが可能だが、問題は、同じワープ内のスレッドは、このカーネルは非常に非効率的になり、同じメッセージタイプを処理しているです。スレッドを正しく同期させるための助けがあれば、大いに感謝します。
実際の質問がありますか?私は1つを見ません..... – talonmies
私は見ていないことはどういう意味ですか?私は、cudaカーネル関数を書くのが難しいです。 – gsm1986
あなたは今見ていますか? – gsm1986