2013-08-04 30 views
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; 
} 

可能有人请帮忙吗?

+0

你为什么声明RNG,分布均匀,但没有使用这些额外的?变量可减少寄存器的数目,并可以在不经意间影响正规化功能 –

+0

@GearoidMurphy好点!这是我忘记删除的旧代码的一部分。我删除了这些行,错误仍然存​​在。我也在这里修改了代码片段。 – TheGame

+0

在这种情况下,我能想到的唯一可能性是您传递给normalize函数的临时参数正在导致某种禁止操作,例如除以零,您是否试图剥离其余代码并*只有*使用标准化函数,您可以确定的参数是安全的。 –

回答

0

所以问题是,我是具有由零误差的除法在温度为距离的特定值起因于(接近于零)非常少的值,U和V,这是通过在GLM零误差导致除法::正常化。我通过在归一化之前检查temp的值来解决这个问题,并且如果它高于给定的阈值,只有归一化的temp。这解决了问题。

相关问题