Программа CUDA Convex Hull дает сбой при большом вводе - PullRequest
2 голосов
/ 18 августа 2011

Я пытаюсь реализовать алгоритм quickHull (для выпуклой оболочки) параллельно в CUDA. Это работает правильно для input_size <= 1 миллион. Когда я набираю 10 миллионов очков, программа вылетает. Размер моей графической карты составляет 1982 МБ, и все мои структуры данных в алгоритме в совокупности требуют не более 600 МБ для этого входного размера, что составляет менее 50% доступного пространства. </p>

Комментируя строки моих ядер, я обнаружил, что сбой происходит, когда я пытаюсь получить доступ к элементу массива, и индекс элемента, к которому я пытаюсь получить доступ, не выходит за пределы (проверено дважды). Ниже приведен код ядра, в котором происходит сбой.

for(unsigned int i = old_setIndex; i < old_setIndex + old_setS[tid]; i++) 
{

    int pI = old_set[i];
    if(pI <= -1 || pI > pts.size())
    {               
        printf("Thread %d: i = %d, pI = %d\n", tid, i, pI);
        continue;
    }
    p = pts[pI];

    double d = distance(A,B,p);

    if(d > dist) {
        dist = d;
        furthestPoint = i;
        fpi = pI;
    }
}
//fpi = old_set[furthestPoint]; 
//printf("Thread %d: Furthestpoint = %d\n", tid, furthestPoint);

Мой код падает, когда я раскомментирую операторы (доступ к массиву и printf) после цикла for. Я не могу объяснить ошибку, поскольку furthestPoint всегда находится в пределах размера массива old_set. Old_setS хранит размер меньших массивов, с которыми может работать каждый поток. Сбой, даже если просто попытаться вывести значение furthestPoint (последняя строка) без оператора доступа к массиву над ним.

Нет проблем с приведенным выше кодом для размера ввода <= 1 миллион. Я переполняю какой-то буфер в устройстве в случае 10 миллионов? </p>

Пожалуйста, помогите мне найти источник катастрофы.

1 Ответ

3 голосов
/ 18 августа 2011

В вашем коде нет свободного доступа к памяти (или, по крайней мере, нет такого, который вызывает симптомы, которые вы видите).

Что происходит, так это то, что ваше ядро ​​убито драйвером дисплеяпотому что это занимает слишком много времени для выполнения на вашем дисплее графического процессора.Все драйверы дисплея платформы CUDA включают ограничение по времени для любой операции на графическом процессоре.Это существует для предотвращения зависания дисплея в течение достаточно долгого времени, когда либо ядро ​​ОС паникует, либо пользователь паникует и думает, что машина вышла из строя.На используемой платформе Windows ограничение по времени составляет около 2 секунд.

То, что частично вводит вас в заблуждение, заставляет вас думать, что источником проблемы является адресация массивов, так как комментирование кода делает проблему исчезающей.Но то, что действительно происходит, - это артефакт оптимизации компилятора.Когда вы закомментируете запись в глобальную память, компилятор распознает, что вычисления, которые приводят к сохранению значения, не используются, и он удаляет весь этот код из кода ассемблера, который он выдает (google "nvcc Removal Code" для получения дополнительной информации).Это приводит к тому, что код запускается намного быстрее и ограничивает время дисплея.

Обходные пути см. в этом недавнем вопросе и ответе stackoverflow

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