Параллельное Dynami c Программирование с CUDA - PullRequest
0 голосов
/ 18 января 2020

Это моя первая попытка реализовать рекурсию с помощью CUDA. Цель состоит в том, чтобы извлечь все комбинации из набора символов «12345», используя возможности CUDA для динамического распараллеливания задачи. Вот мое ядро:

__device__ char route[31] = { "_________________________"};
__device__ char init[6] = { "12345" };

__global__ void Recursive(int depth) {

    // up to depth 6
    if (depth == 5) return;     
    // newroute = route - idx

    int x = depth * 6;
    printf("%s\n", route);

    int o = 0;
    int newlen = 0;
    for (int i = 0; i<6; ++i)
    {
        if (i != threadIdx.x)
        {
            route[i+x-o] = init[i];
            newlen++;
        }
        else                
        {
            o = 1;
        }
    }

    Recursive<<<1,newlen>>>(depth + 1);

}

__global__ void RecursiveCount() {
    Recursive <<<1,5>>>(0); 

}

Идея состоит в том, чтобы исключить 1 элемент (элемент, соответствующий threadIdx) в каждом отдельном потоке. В каждом рекурсивном вызове, используя переменную глубину, он работает над другой базой (переменной x) переменной устройства маршрута.

Я ожидаю, что ядро ​​выдаст что-то вроде:

2345 _____________________

1345 _____________________

1245 _____________________

1234 _____________________

2345_345 _________________

2345_245 _________________

2345_234 _________________

2345 1023 * 2345_345__35 _____________

2345_345__34 _____________

..

2345_245__45 _____________

..

Но это подсказывает ...

· _____________

· _____________

· _____________

· _____________

· _____________

*1045* · 2345

· 2345

· 2345

· 2345

...

Что я делаю не так?

Ответы [ 2 ]

5 голосов
/ 18 января 2020

Что я делаю не так?

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

  1. Я рекомендую предоставить полный пример . На мой взгляд, это в основном требуется для переполнения стека, см. Пункт 1 здесь , обратите внимание на использование слова «должен». В вашем примере отсутствует какой-либо код хоста, включая исходный вызов ядра. Это всего лишь несколько дополнительных строк кода, почему бы не включить его? Конечно, в этом случае я могу определить, каким должен был быть вызов, но почему бы просто не включить его? В любом случае, исходя из указанных вами результатов, кажется вполне очевидным, что конфигурация запуска хоста должна быть <<<1,1>>>.

  2. Это не кажется мне логичным :

    Я ожидаю, что ядро ​​выдаст что-то вроде:

    2345 _____________________

    Самое первое, что делает ваше ядро, это распечатывает переменную route, прежде чем вносить какие-либо изменения в него, поэтому я бы ожидал _____________________. Однако мы можем «исправить» это, переместив распечатку в конец ядра.

  3. Вы можете быть не уверены, что такое переменная __device__. Это глобальная переменная, и существует только одна ее копия. Поэтому, когда вы изменяете его в коде ядра, каждый поток в каждом ядре пытается изменить одну и ту же глобальную переменную одновременно. Это не может иметь упорядоченных результатов в любой параллельной среде. Я решил «исправить» это, сделав локальную копию для каждого потока для работы.

  4. У вас есть ошибка off-1, а также ошибка экстента в этом l oop:

    for (int i = 0; i<6; ++i)
    

    Off-by-1 ошибка связана с тем, что вы перебираете более 6 возможных элементов (т. е. i может достигать значения 5), но в вашей переменной init есть только 5 элементов (шестой элемент является нулевым терминатором. правильное индексирование начинается с 0-4 (при этом один из них пропускается). На последующих глубинах итерации необходимо уменьшить эту степень индексации на 1. Обратите внимание, что я решил исправить первую ошибку здесь, увеличив длину init. Есть и другие способы исправить, конечно. Мой метод вставляет дополнительный _ между глубинами в результате.

  5. Вы предполагаете, что на каждой глубине итерации, правильный выбор элементов одинаковы и в том же порядке, то есть init. Однако это не так. На каждой глубине выбор элементов должен выбираться не из неизменной переменной init, а из вариантов, переданных из предыдущая глубина. Нам также нужна локальная копия для каждого потока init.

  6. Несколько других комментариев о CUDA Dynami c Параллелизм (CDP). При передаче указателей на данные из одной области ядра в дочернюю область, указатели локального пространства не могут быть использованы. Поэтому я выделяю локальную копию route из кучи, чтобы ее можно было передать дочерним ядрам. init может быть выведено из route, поэтому мы можем использовать обычную локальную переменную для myinit.

  7. Здесь вы быстро достигнете некоторого динамического c ограничения параллелизма (и, возможно, памяти), если продолжите это. Я считаю, что общее количество запусков ядра для этого составляет 5 ^ 5, что составляет 3125 (я делаю это быстро, я могу ошибаться). По умолчанию CDP имеет ограничение на запуск 2000 ядер. Мы здесь не будем подходить согласно тому, что я вижу, но рано или поздно вы столкнетесь с этим, если увеличите глубину или ширину этой операции. Кроме того, выделение в ядре из кучи устройства по умолчанию ограничено 8 КБ. Кажется, я не достигаю этого предела, но, вероятно, так оно и есть, поэтому мой дизайн, вероятно, следует изменить, чтобы исправить это.

  8. Наконец, выход в ядре printf ограничен до размера конкретного буфера. Если этот метод еще не достиг этого предела, он скоро будет увеличен, если вы увеличите ширину или глубину.

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

$ cat t1639.cu
#include <stdio.h>

__device__ char route[31] = { "_________________________"};
__device__ char init[7] = { "12345_" };

__global__ void Recursive(int depth, const char *oroute) {


    char *nroute = (char *)malloc(31);
    char myinit[7];
    if (depth == 0) memcpy(myinit, init, 6);
    else memcpy(myinit, oroute+(depth-1)*6, 6);
    myinit[6] = 0;
    if (nroute == NULL) {printf("oops\n"); return;}
    memcpy(nroute, oroute, 30);
    nroute[30] = 0;
    // up to depth 6
    if (depth == 5) return;
    // newroute = route - idx

    int x = depth * 6;
    //printf("%s\n", nroute);

    int o = 0;
    int newlen = 0;
    for (int i = 0; i<(6-depth); ++i)
    {
        if (i != threadIdx.x)
        {
            nroute[i+x-o] = myinit[i];
            newlen++;
        }
        else
        {
            o = 1;
        }
    }
    printf("%s\n", nroute);

    Recursive<<<1,newlen>>>(depth + 1, nroute);

}

__global__ void RecursiveCount() {
    Recursive <<<1,5>>>(0, route);
}

int main(){

  RecursiveCount<<<1,1>>>();
  cudaDeviceSynchronize();
}
$ nvcc -o t1639 t1639.cu -rdc=true -lcudadevrt -arch=sm_70
$ cuda-memcheck ./t1639
========= CUDA-MEMCHECK
2345_____________________
1345_____________________
1245_____________________
1235_____________________
1234_____________________
2345__345________________
2345__245________________
2345__235________________
2345__234________________
2345__2345_______________
2345__345___45___________
2345__345___35___________
2345__345___34___________
2345__345___345__________
2345__345___45____5______
2345__345___45____4______
2345__345___45____45_____
2345__345___45____5______
2345__345___45____5_____5
2345__345___45____4______
2345__345___45____4_____4
2345__345___45____45____5
2345__345___45____45____4
2345__345___35____5______
2345__345___35____3______
2345__345___35____35_____
2345__345___35____5______
2345__345___35____5_____5
2345__345___35____3______
2345__345___35____3_____3
2345__345___35____35____5
2345__345___35____35____3
2345__345___34____4______
2345__345___34____3______
2345__345___34____34_____
2345__345___34____4______
2345__345___34____4_____4
2345__345___34____3______
2345__345___34____3_____3
2345__345___34____34____4
2345__345___34____34____3
2345__345___345___45_____
2345__345___345___35_____
2345__345___345___34_____
2345__345___345___45____5
2345__345___345___45____4
2345__345___345___35____5
2345__345___345___35____3
2345__345___345___34____4
2345__345___345___34____3
2345__245___45___________
2345__245___25___________
2345__245___24___________
2345__245___245__________
2345__245___45____5______
2345__245___45____4______
2345__245___45____45_____
2345__245___45____5______
2345__245___45____5_____5
2345__245___45____4______
2345__245___45____4_____4
2345__245___45____45____5
2345__245___45____45____4
2345__245___25____5______
2345__245___25____2______
2345__245___25____25_____
2345__245___25____5______
2345__245___25____5_____5
2345__245___25____2______
2345__245___25____2_____2
2345__245___25____25____5
2345__245___25____25____2
2345__245___24____4______
2345__245___24____2______
2345__245___24____24_____
2345__245___24____4______
2345__245___24____4_____4
2345__245___24____2______
2345__245___24____2_____2
2345__245___24____24____4
2345__245___24____24____2
2345__245___245___45_____
2345__245___245___25_____
2345__245___245___24_____
2345__245___245___45____5
2345__245___245___45____4
2345__245___245___25____5
2345__245___245___25____2
2345__245___245___24____4
2345__245___245___24____2
2345__235___35___________
2345__235___25___________
2345__235___23___________
2345__235___235__________
2345__235___35____5______
2345__235___35____3______
2345__235___35____35_____
2345__235___35____5______
2345__235___35____5_____5
2345__235___35____3______
2345__235___35____3_____3
2345__235___35____35____5
2345__235___35____35____3
2345__235___25____5______
2345__235___25____2______
2345__235___25____25_____
2345__235___25____5______
2345__235___25____5_____5
2345__235___25____2______
2345__235___25____2_____2
2345__235___25____25____5
2345__235___25____25____2
2345__235___23____3______
2345__235___23____2______
2345__235___23____23_____
2345__235___23____3______
2345__235___23____3_____3
2345__235___23____2______
2345__235___23____2_____2
2345__235___23____23____3
2345__235___23____23____2
2345__235___235___35_____
2345__235___235___25_____
2345__235___235___23_____
2345__235___235___35____5
2345__235___235___35____3
2345__235___235___25____5
2345__235___235___25____2
2345__235___235___23____3
2345__235___235___23____2
2345__234___34___________
2345__234___24___________
2345__234___23___________
2345__234___234__________
2345__234___34____4______
2345__234___34____3______
2345__234___34____34_____
2345__234___34____4______
2345__234___34____4_____4
2345__234___34____3______
2345__234___34____3_____3
2345__234___34____34____4
2345__234___34____34____3
2345__234___24____4______
2345__234___24____2______
2345__234___24____24_____
2345__234___24____4______
2345__234___24____4_____4
2345__234___24____2______
2345__234___24____2_____2
2345__234___24____24____4
2345__234___24____24____2
2345__234___23____3______
2345__234___23____2______
2345__234___23____23_____
2345__234___23____3______
2345__234___23____3_____3
2345__234___23____2______
2345__234___23____2_____2
2345__234___23____23____3
2345__234___23____23____2
2345__234___234___34_____
2345__234___234___24_____
2345__234___234___23_____
2345__234___234___34____4
2345__234___234___34____3
2345__234___234___24____4
2345__234___234___24____2
2345__234___234___23____3
2345__234___234___23____2
2345__2345__345__________
2345__2345__245__________
2345__2345__235__________
2345__2345__234__________
2345__2345__345___45_____
2345__2345__345___35_____
2345__2345__345___34_____
2345__2345__345___45____5
2345__2345__345___45____4
2345__2345__345___35____5
2345__2345__345___35____3
2345__2345__345___34____4
2345__2345__345___34____3
2345__2345__245___45_____
2345__2345__245___25_____
2345__2345__245___24_____
2345__2345__245___45____5
2345__2345__245___45____4
2345__2345__245___25____5
2345__2345__245___25____2
2345__2345__245___24____4
2345__2345__245___24____2
2345__2345__235___35_____
2345__2345__235___25_____
2345__2345__235___23_____
2345__2345__235___35____5
2345__2345__235___35____3
2345__2345__235___25____5
2345__2345__235___25____2
2345__2345__235___23____3
2345__2345__235___23____2
2345__2345__234___34_____
2345__2345__234___24_____
2345__2345__234___23_____
2345__2345__234___34____4
2345__2345__234___34____3
2345__2345__234___24____4
2345__2345__234___24____2
2345__2345__234___23____3
2345__2345__234___23____2
1345__345________________
1345__145________________
1345__135________________
1345__134________________
1345__1345_______________
1345__345___45___________
1345__345___35___________
1345__345___34___________
1345__345___345__________
1345__345___45____5______
1345__345___45____4______
1345__345___45____45_____
1345__345___45____5______
1345__345___45____5_____5
1345__345___45____4______
1345__345___45____4_____4
1345__345___45____45____5
1345__345___45____45____4
1345__345___35____5______
1345__345___35____3______
1345__345___35____35_____
1345__345___35____5______
1345__345___35____5_____5
1345__345___35____3______
1345__345___35____3_____3
1345__345___35____35____5
1345__345___35____35____3
1345__345___34____4______
1345__345___34____3______
1345__345___34____34_____
1345__345___34____4______
1345__345___34____4_____4
1345__345___34____3______
1345__345___34____3_____3
1345__345___34____34____4
1345__345___34____34____3
1345__345___345___45_____
1345__345___345___35_____
1345__345___345___34_____
1345__345___345___45____5
1345__345___345___45____4
1345__345___345___35____5
1345__345___345___35____3
1345__345___345___34____4
1345__345___345___34____3
1345__145___45___________
1345__145___15___________
1345__145___14___________
1345__145___145__________
1345__145___45____5______
1345__145___45____4______
1345__145___45____45_____
1345__145___45____5______
1345__145___45____5_____5
1345__145___45____4______
1345__145___45____4_____4
1345__145___45____45____5
1345__145___45____45____4
1345__145___15____5______
1345__145___15____1______
1345__145___15____15_____
1345__145___15____5______
1345__145___15____5_____5
1345__145___15____1______
1345__145___15____1_____1
1345__145___15____15____5
1345__145___15____15____1
1345__145___14____4______
1345__145___14____1______
1345__145___14____14_____
1345__145___14____4______
1345__145___14____4_____4
1345__145___14____1______
1345__145___14____1_____1
1345__145___14____14____4
1345__145___14____14____1
1345__145___145___45_____
1345__145___145___15_____
1345__145___145___14_____
1345__145___145___45____5
1345__145___145___45____4
1345__145___145___15____5
1345__145___145___15____1
1345__145___145___14____4
1345__145___145___14____1
1345__135___35___________
1345__135___15___________
1345__135___13___________
1345__135___135__________
1345__135___35____5______
1345__135___35____3______
1345__135___35____35_____
1345__135___35____5______
1345__135___35____5_____5
1345__135___35____3______
1345__135___35____3_____3
1345__135___35____35____5
1345__135___35____35____3
1345__135___15____5______
1345__135___15____1______
1345__135___15____15_____
1345__135___15____5______
1345__135___15____5_____5
1345__135___15____1______
1345__135___15____1_____1
1345__135___15____15____5
1345__135___15____15____1
1345__135___13____3______
1345__135___13____1______
1345__135___13____13_____
1345__135___13____3______
1345__135___13____3_____3
1345__135___13____1______
1345__135___13____1_____1
1345__135___13____13____3
1345__135___13____13____1
1345__135___135___35_____
1345__135___135___15_____
1345__135___135___13_____
1345__135___135___35____5
1345__135___135___35____3
1345__135___135___15____5
1345__135___135___15____1
1345__135___135___13____3
1345__135___135___13____1
1345__134___34___________
1345__134___14___________
1345__134___13___________
1345__134___134__________
1345__134___34____4______
1345__134___34____3______
1345__134___34____34_____
1345__134___34____4______
1345__134___34____4_____4
1345__134___34____3______
1345__134___34____3_____3
1345__134___34____34____4
1345__134___34____34____3
1345__134___14____4______
1345__134___14____1______
1345__134___14____14_____
1345__134___14____4______
1345__134___14____4_____4
1345__134___14____1______
1345__134___14____1_____1
1345__134___14____14____4
1345__134___14____14____1
1345__134___13____3______
1345__134___13____1______
1345__134___13____13_____
1345__134___13____3______
1345__134___13____3_____3
1345__134___13____1______
1345__134___13____1_____1
1345__134___13____13____3
1345__134___13____13____1
1345__134___134___34_____
1345__134___134___14_____
1345__134___134___13_____
1345__134___134___34____4
1345__134___134___34____3
1345__134___134___14____4
1345__134___134___14____1
1345__134___134___13____3
1345__134___134___13____1
1345__1345__345__________
1345__1345__145__________
1345__1345__135__________
1345__1345__134__________
1345__1345__345___45_____
1345__1345__345___35_____
1345__1345__345___34_____
1345__1345__345___45____5
1345__1345__345___45____4
1345__1345__345___35____5
1345__1345__345___35____3
1345__1345__345___34____4
1345__1345__345___34____3
1345__1345__145___45_____
1345__1345__145___15_____
1345__1345__145___14_____
1345__1345__145___45____5
1345__1345__145___45____4
1345__1345__145___15____5
1345__1345__145___15____1
1345__1345__145___14____4
1345__1345__145___14____1
1345__1345__135___35_____
1345__1345__135___15_____
1345__1345__135___13_____
1345__1345__135___35____5
1345__1345__135___35____3
1345__1345__135___15____5
1345__1345__135___15____1
1345__1345__135___13____3
1345__1345__135___13____1
1345__1345__134___34_____
1345__1345__134___14_____
1345__1345__134___13_____
1345__1345__134___34____4
1345__1345__134___34____3
1345__1345__134___14____4
1345__1345__134___14____1
1345__1345__134___13____3
1345__1345__134___13____1
1245__245________________
1245__145________________
1245__125________________
1245__124________________
1245__1245_______________
1245__245___45___________
1245__245___25___________
1245__245___24___________
1245__245___245__________
1245__245___45____5______
1245__245___45____4______
1245__245___45____45_____
1245__245___45____5______
1245__245___45____5_____5
1245__245___45____4______
1245__245___45____4_____4
1245__245___45____45____5
1245__245___45____45____4
1245__245___25____5______
1245__245___25____2______
1245__245___25____25_____
1245__245___25____5______
1245__245___25____5_____5
1245__245___25____2______
1245__245___25____2_____2
1245__245___25____25____5
1245__245___25____25____2
1245__245___24____4______
1245__245___24____2______
1245__245___24____24_____
1245__245___24____4______
1245__245___24____4_____4
1245__245___24____2______
1245__245___24____2_____2
1245__245___24____24____4
1245__245___24____24____2
1245__245___245___45_____
1245__245___245___25_____
1245__245___245___24_____
1245__245___245___45____5
1245__245___245___45____4
1245__245___245___25____5
1245__245___245___25____2
1245__245___245___24____4
1245__245___245___24____2
1245__145___45___________
1245__145___15___________
1245__145___14___________
1245__145___145__________
1245__145___45____5______
1245__145___45____4______
1245__145___45____45_____
1245__145___45____5______
1245__145___45____5_____5
1245__145___45____4______
...
1235__1235__235___25_____
1235__1235__235___23_____
1235__1235__235___35____5
1235__1235__235___35____3
1235__1235__235___25____5
1235__1235__235___25____2
1235__1235__235___23____3
1235__1235__235___23____2
1235__1235__135___35_____
1235__1235__135___15_____
1235__1235__135___13_____
1235__1235__135___35____5
1235__1235__135___35____3
1235__1235__135___15____5
1235__1235__135___15____1
1235__1235__135___13____3
1235__1235__135___13____1
1235__1235__125___25_____
1235__1235__125___15_____
1235__1235__125___12_____
1235__1235__125___25____5
1235__1235__125___25____2
1235__1235__125___15____5
1235__1235__125___15____1
1235__1235__125___12____2
1235__1235__125___12____1
1235__1235__123___23_____
1235__1235__123___13_____
1235__1235__123___12_____
1235__1235__123___23____3
1235__1235__123___23____2
1235__1235__123___13____3
1235__1235__123___13____1
1235__1235__123___12____2
1235__1235__123___12____1
1234__234________________
1234__134________________
1234__124________________
1234__123________________
1234__1234_______________
1234__234___34___________
1234__234___24___________
1234__234___23___________
1234__234___234__________
1234__234___34____4______
1234__234___34____3______
1234__234___34____34_____
1234__234___34____4______
1234__234___34____4_____4
1234__234___34____3______
1234__234___34____3_____3
1234__234___34____34____4
1234__234___34____34____3
1234__234___24____4______
1234__234___24____2______
1234__234___24____24_____
1234__234___24____4______
1234__234___24____4_____4
1234__234___24____2______
1234__234___24____2_____2
1234__234___24____24____4
1234__234___24____24____2
1234__234___23____3______
1234__234___23____2______
1234__234___23____23_____
1234__234___23____3______
1234__234___23____3_____3
1234__234___23____2______
1234__234___23____2_____2
1234__234___23____23____3
1234__234___23____23____2
1234__234___234___34_____
1234__234___234___24_____
1234__234___234___23_____
1234__234___234___34____4
1234__234___234___34____3
1234__234___234___24____4
1234__234___234___24____2
1234__234___234___23____3
1234__234___234___23____2
1234__134___34___________
1234__134___14___________
1234__134___13___________
1234__134___134__________
1234__134___34____4______
1234__134___34____3______
1234__134___34____34_____
1234__134___34____4______
1234__134___34____4_____4
1234__134___34____3______
1234__134___34____3_____3
1234__134___34____34____4
1234__134___34____34____3
1234__134___14____4______
1234__134___14____1______
1234__134___14____14_____
1234__134___14____4______
1234__134___14____4_____4
1234__134___14____1______
1234__134___14____1_____1
1234__134___14____14____4
1234__134___14____14____1
1234__134___13____3______
1234__134___13____1______
1234__134___13____13_____
1234__134___13____3______
1234__134___13____3_____3
1234__134___13____1______
1234__134___13____1_____1
1234__134___13____13____3
1234__134___13____13____1
1234__134___134___34_____
1234__134___134___14_____
1234__134___134___13_____
1234__134___134___34____4
1234__134___134___34____3
1234__134___134___14____4
1234__134___134___14____1
1234__134___134___13____3
1234__134___134___13____1
1234__124___24___________
1234__124___14___________
1234__124___12___________
1234__124___124__________
1234__124___24____4______
1234__124___24____2______
1234__124___24____24_____
1234__124___24____4______
1234__124___24____4_____4
1234__124___24____2______
1234__124___24____2_____2
1234__124___24____24____4
1234__124___24____24____2
1234__124___14____4______
1234__124___14____1______
1234__124___14____14_____
1234__124___14____4______
1234__124___14____4_____4
1234__124___14____1______
1234__124___14____1_____1
1234__124___14____14____4
1234__124___14____14____1
1234__124___12____2______
1234__124___12____1______
1234__124___12____12_____
1234__124___12____2______
1234__124___12____2_____2
1234__124___12____1______
1234__124___12____1_____1
1234__124___12____12____2
1234__124___12____12____1
1234__124___124___24_____
1234__124___124___14_____
1234__124___124___12_____
1234__124___124___24____4
1234__124___124___24____2
1234__124___124___14____4
1234__124___124___14____1
1234__124___124___12____2
1234__124___124___12____1
1234__123___23___________
1234__123___13___________
1234__123___12___________
1234__123___123__________
1234__123___23____3______
1234__123___23____2______
1234__123___23____23_____
1234__123___23____3______
1234__123___23____3_____3
1234__123___23____2______
1234__123___23____2_____2
1234__123___23____23____3
1234__123___23____23____2
1234__123___13____3______
1234__123___13____1______
1234__123___13____13_____
1234__123___13____3______
1234__123___13____3_____3
1234__123___13____1______
1234__123___13____1_____1
1234__123___13____13____3
1234__123___13____13____1
1234__123___12____2______
1234__123___12____1______
1234__123___12____12_____
1234__123___12____2______
1234__123___12____2_____2
1234__123___12____1______
1234__123___12____1_____1
1234__123___12____12____2
1234__123___12____12____1
1234__123___123___23_____
1234__123___123___13_____
1234__123___123___12_____
1234__123___123___23____3
1234__123___123___23____2
1234__123___123___13____3
1234__123___123___13____1
1234__123___123___12____2
1234__123___123___12____1
1234__1234__234__________
1234__1234__134__________
1234__1234__124__________
1234__1234__123__________
1234__1234__234___34_____
1234__1234__234___24_____
1234__1234__234___23_____
1234__1234__234___34____4
1234__1234__234___34____3
1234__1234__234___24____4
1234__1234__234___24____2
1234__1234__234___23____3
1234__1234__234___23____2
1234__1234__134___34_____
1234__1234__134___14_____
1234__1234__134___13_____
1234__1234__134___34____4
1234__1234__134___34____3
1234__1234__134___14____4
1234__1234__134___14____1
1234__1234__134___13____3
1234__1234__134___13____1
1234__1234__124___24_____
1234__1234__124___14_____
1234__1234__124___12_____
1234__1234__124___24____4
1234__1234__124___24____2
1234__1234__124___14____4
1234__1234__124___14____1
1234__1234__124___12____2
1234__1234__124___12____1
1234__1234__123___23_____
1234__1234__123___13_____
1234__1234__123___12_____
1234__1234__123___23____3
1234__1234__123___23____2
1234__1234__123___13____3
1234__1234__123___13____1
1234__1234__123___12____2
1234__1234__123___12____1
========= ERROR SUMMARY: 0 errors
$
1 голос
/ 18 января 2020

Ответ, данный Робертом Кровеллой, является правильным в 5-м пункте, ошибка заключалась в использовании init в каждом рекурсивном вызове, но я хочу уточнить кое-что, что может быть полезно для других новичков с CUDA.

Я использовал эту переменную, потому что когда я пытался запустить дочернее ядро, передавая локальную переменную, я всегда получал исключение: Error: a pointer to local memory cannot be passed to a launch as an argument.

Поскольку я C# эксперт-разработчик, я не использовал к использованию указателей (Ref выполняет для этого низкоуровневую работу), поэтому я подумал, что в программировании на CUDA / c нет способа.

Как показывает Роберт в своем коде, это возможно копирование указателя с помощью memalloc для использования его в качестве ссылочного аргумента.

Вот ядро, упрощенное как пример глубокой рекурсии.

__device__ char init[6] = { "12345" };

__global__ void Recursive(int depth, const char* route) {

    // up to depth 6
    if (depth == 5) return;

    //declaration for a referable argument (point 6)
    char* newroute = (char*)malloc(6); 
    memcpy(newroute, route, 5);

    int o = 0;
    int newlen = 0;
    for (int i = 0; i < (6 - depth); ++i)
    {
        if (i != threadIdx.x)
        {
            newroute[i - o] = route[i];
            newlen++;
        }
        else
        {
            o = 1;
        }
    }

    printf("%s\n", newroute);

    Recursive <<<1, newlen>>>(depth + 1, newroute);

}

__global__ void RecursiveCount() {
    Recursive <<<1, 5>>>(0, init);
}

Я не добавляю основной вызов потому что я использую ManagedCUDA для C#, но, как говорит Роберт, можно выяснить, каков вызов RecursiveCount.

Об окончании массивов char с помощью /0 ... извините, но я не не знаю точно, в чем выгода; этот код работает без них.

...