Я пытаюсь реализовать алгоритм 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>
Пожалуйста, помогите мне найти источник катастрофы.