CUDA内核函数,用于解析具有可变数量消息的数据包

时间:2012-02-09 20:17:33

标签: cuda

我是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中的线程正在处理相同的消息类型,这使得这个内核非常低效。任何有关正确同步线程的帮助都将非常感激。

1 个答案:

答案 0 :(得分:1)

为了使CUDA程序高效,您经常需要发明新的算法。只是将一个好的CPU程序复制到GPU上并不会使它更快(它甚至可能使它更慢!)。 关键组件之一是算法的某些部分可以并行工作,也可以工作在独立数据上。图像处理或线性代数通常属于该类别。

其次,必须要做很多计算。只需要很少的条件和简单的算术就不会这样做 - 你将为将数据传输到GPU付出更多,而不是从更快的处理中获得。

在解析或流处理中(除非这是视频流)我在任何地方都看不到这些属性。输入的下一个字节的含义在很大程度上取决于您已经读过的信息。

如果您可以更改通信协议,可以尝试一次打开几个连接,并从那里读取独立数据。但是GPU上仍然需要进行大量的计算,否则就不值得了。