Извините за плохой заголовок. Я не мог придумать ничего лучшего.
В каждом примере программ 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;
}
}
}