在Mac OS X上使用CUDA 5.5时内核失败错误

时间:2013-08-04 17:01:33

标签: c++ macos cuda glm-math

我正在写一个CUDA Raytracer,似乎陷入了一个奇怪的问题。我在Mac OS X上使用CUDA 5.5和GCC4.2.1,并使用GLM 0.9.4.4。 每当我调用我的raycastFromCameraKernel函数时,我都会收到此错误:

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;
}

有人可以帮忙吗?

1 个答案:

答案 0 :(得分:0)

所以问题在于,由于特定的距离u,V值的温度值非常小(接近于零)而导致零误差,这导致glm中除以零误差: :正常化。我通过在标准化之前检查temp的值来解决这个问题,并且如果它高于给定的阈值则仅标准化temp。这解决了这个问题。