CUDA: только одна работа для начала - PullRequest
0 голосов
/ 19 октября 2011

Извините за плохой заголовок. Я не мог придумать ничего лучшего.

В каждом примере программ CUDA, которые я видел, есть предопределенные данные, готовые к распараллеливанию. Типичным примером является сумма двух матриц, где две матрицы уже заполнены. Но как насчет программ, которые генерируют новые задачи. Как мне смоделировать это в CUDA? Как передать результат, чтобы другие потоки могли начать работать с ним.

Например: Скажем, я запускаю ядро ​​на одной работе. Эта работа создает 10 новых независимых рабочих мест. Каждый из них генерирует 10 новых независимых работ и так далее. Это похоже на задачу, которая очень параллельна, потому что каждая работа независима. Проблема в том, что я не знаю, как смоделировать это в CUDA. Я попытался сделать это в CUDA, где я использовал цикл while в ядре, чтобы продолжить опрос, может ли поток начать вычисления. Каждой теме была назначена работа. Но это не сработало. Казалось, игнорировать цикл while.

Пример кода:

On host:
fill ready array with 0
ready[0] = 1;

On device:
__global__ void kernel(int *ready, int *result)
{
    int tid = threadIdx.x;
    if(tid < N)
    {
        int condition = ready[tid];
        while(condition != 1)
        {
            condition = ready[tid];
        }

        result[tid] = 3;// later do real computation

        //children jobs is now ready to work
        int childIndex = tid * 10;
        if(childIndex < (N-10))
        {
            ready[childIndex + 1] = 1; ready[childIndex + 2] = 1;
            ready[childIndex + 3] = 1; ready[childIndex + 4] = 1;
            ready[childIndex + 5] = 1; ready[childIndex + 6] = 1;
            ready[childIndex + 7] = 1; ready[childIndex + 8] = 1;
            ready[childIndex + 9] = 1; ready[childIndex +10] = 1;
        }
    }
}

Ответы [ 2 ]

8 голосов
/ 19 октября 2011

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

Я бы посмотрел пример параллельного сокращения CUDA. Показывает, как разложить на несколько ядер. Единственная разница в том, что вместо того, чтобы выполнять меньше работы между ядрами, вы будете делать больше.

1 голос
/ 28 июля 2013

Похоже, вы можете использовать CUDA Dynamic Parallelism .При этом вы можете вызывать ядро ​​внутри другого ядра, то есть после того, как первое ядро ​​закончилось и завершило генерацию 10 задач, непосредственно перед этим вы можете вызвать следующее ядро, которое будет выполнять эти задачи.

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