Я пишу трассировщик пути для GPU, используя CUDA 10.2. Вся программа работала нормально, пока я не добавил рекурсивный вызов функции трассировки. nv cc все еще компилирует его, хотя и с предупреждением: «Код серьезности Описание Предупреждение о состоянии подавления строки файла проекта Размер стека для функции входа« не может быть определен статически ». Когда графический процессор достигает точки, он останавливается, и в следующий раз, когда центральный процессор получает cudaError от вызова API, это ошибка cuda 715, которая является cudaErrorIllegalInstruction. Я попытался воссоздать проблему, написав другую рекурсивную пару ядро / функция, и компилятор выдал то же самое предупреждение, но оно выполнялось ожидаемым образом. К сожалению, это означает, что я должен сбросить всю свою функцию здесь (если есть какие-либо вопросы к используемым функциям и типам, я с радостью на них отвечу):
__device__ Vec3 trace(
const Settings& settings,
const Ray& r,
const Shape* shapes,
const size_t nshapes,
uint8_t bounces,
curandState& randState) {
if (bounces >= settings.maxBounces) {
return Vec3(0.0f);
}
const Shape* shape = nullptr;
float t = inf;
bool flipNormal;
float dist;
for (size_t i = 0; i < nshapes; i++) {
if (shapes[i].intersect(r, dist, flipNormal) && dist < t) {
shape = shapes + i;
t = dist;
}
}
if (shape == nullptr)
return settings.background;
const Vec3 hitPos = r.ori + t * r.dir;
const Vec3 normal = flipNormal ? -shape->normal(hitPos) : shape->normal(hitPos);
const Vec3 hemiDir = cosineSample(normal, randState);
const Vec3 traceCol = trace(
settings,
Ray(hitPos + normal * settings.bias, hemiDir),
shapes,
nshapes,
bounces + 1,
randState
);
return shape->surface.emittance + shape->surface.color * traceCol;
}
У кого-нибудь еще была эта проблема, и в этом случае, как это было исправлено? Я мог бы, вероятно, изменить дизайн на нерекурсивный дизайн, хотя это не было бы оптимальным решением. Я даже не знаю, с чего начать с отладки этой проблемы, поэтому любые идеи очень ценятся.