Функция ядра CUDA для анализа пакета с переменным количеством сообщений - PullRequest
0 голосов
/ 10 февраля 2012

Я новичок в 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;
    }
}

Я могу проанализировать данные, но проблема в том, что потоки в одной и той же деформации обрабатывают один и тот же тип сообщения, что делает это ядро ​​крайне неэффективным. Любая помощь в синхронизации потоков должным образом будет принята.

1 Ответ

1 голос
/ 10 февраля 2012

Чтобы сделать программу CUDA эффективной, вам часто приходится изобретать новые алгоритмы. Простое копирование хорошей программы ЦП в GPU не делает ее быстрее (она может даже замедлять работу!). Одним из ключевых компонентов является то, что определенные части алгоритма могут работать параллельно и на независимых данных. Обработка изображений или линейная алгебра часто попадают в эту категорию.

Во-вторых, должно быть много вычислений. Только несколько условий и простая арифметика этого не сделают - вы будете платить гораздо больше за передачу данных в графический процессор, чем вы получите от более быстрой обработки.

При разборе или обработке потока (если это не видеопоток) я нигде не вижу этих свойств. Значение следующего байта вашего ввода сильно зависит от информации, которую вы уже прочитали.

Если вы можете изменить протокол связи, вы можете попытаться открыть несколько соединений одновременно и прочитать оттуда независимые данные. Но все еще нужно много вычислений на GPU, иначе оно того не стоит.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...