我是CUDA的新手,我正在尝试编写一个有效的内核函数来解析包含'k'个不同长度的消息的数据包(我知道)。这就是我所做的。
//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;
}
}
我能够解析数据,但问题是同一个warp中的线程正在处理相同的消息类型,这使得这个内核非常低效。任何有关正确同步线程的帮助都将非常感激。
答案 0 :(得分:1)
为了使CUDA程序高效,您经常需要发明新的算法。只是将一个好的CPU程序复制到GPU上并不会使它更快(它甚至可能使它更慢!)。 关键组件之一是算法的某些部分可以并行工作,也可以工作在独立数据上。图像处理或线性代数通常属于该类别。
其次,必须要做很多计算。只需要很少的条件和简单的算术就不会这样做 - 你将为将数据传输到GPU付出更多,而不是从更快的处理中获得。
在解析或流处理中(除非这是视频流)我在任何地方都看不到这些属性。输入的下一个字节的含义在很大程度上取决于您已经读过的信息。
如果您可以更改通信协议,可以尝试一次打开几个连接,并从那里读取独立数据。但是GPU上仍然需要进行大量的计算,否则就不值得了。