1
我正在编写CUDA Raytracer,似乎陷入了一个奇怪的问题。我在Mac OS X上使用CUDA 5.5和GCC4.2.1,并使用GLM 0.9.4.4。 每当我打电话给我的raycastFromCameraKernel函数,我得到这个错误:在Mac OS X上使用CUDA 5.5时发生内核失败错误
Cuda错误:内核失败!:操作系统调用失败或此操作系统不支持操作。
一些调试后,我想我已经缩小问题的glm::normalize(temp)
功能。如果我通过编写我自己的标准化函数来替代它,代码工作正常。有趣的是,当我使用glm :: normalize编写示例程序来查看它是否正常工作时,它编译并正确运行!
这里是代码有问题的功能:
__host__ __device__ ray raycastFromCameraKernel(glm::vec2 resolution, float time, int x, int y, glm::vec3 eye, glm::vec3 view, glm::vec3 up, glm::vec2 fov)
{
glm::vec3 eyePoint = eye;
glm::vec3 V = up;
glm::vec3 W = view;
glm::vec3 U = glm::cross(V,W); // Perter Sherley page 74 (Creating orthonormal vectors)
float fovY = fov.y;
//d is the near clip plane
float distance = (resolution.y/2.0f)/tan(fovY);
float left = -resolution.x/2;
float right = resolution.x/2;
float top = resolution.y/2;
float bottom = -resolution.y/2;
float u = left + (right - left)*(x + 0.5)/resolution.x;
float v = bottom + (top - bottom)*(y + 0.5)/resolution.y;
ray r;
r.origin = eyePoint;
glm::vec3 temp = -1*distance*W + u*U + v*V;
r.direction = glm::normalize(temp);
return r;
}
可能有人请帮忙吗?
你为什么声明RNG,分布均匀,但没有使用这些额外的?变量可减少寄存器的数目,并可以在不经意间影响正规化功能 –
@GearoidMurphy好点!这是我忘记删除的旧代码的一部分。我删除了这些行,错误仍然存在。我也在这里修改了代码片段。 – TheGame
在这种情况下,我能想到的唯一可能性是您传递给normalize函数的临时参数正在导致某种禁止操作,例如除以零,您是否试图剥离其余代码并*只有*使用标准化函数,您可以确定的参数是安全的。 –