c++ - 在 Mac OS X 上使用 CUDA 5.5 时出现内核失败错误

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

有人可以帮忙吗?

最佳答案

所以问题是,由于距离、u 和 V 的特定值的 temp 中的值非常小(接近于零),我遇到了被零除的错误,这导致了 glm 中的被零除错误: :正常化。我通过在标准化之前检查温度值来解决这个问题,并且只有在温度高于给定阈值时才标准化温度。这解决了问题。

关于c++ - 在 Mac OS X 上使用 CUDA 5.5 时出现内核失败错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18045339/

相关文章:

android - 如何让 Android 模拟器在 macOS 中始终保持在最前面

c++ - 如何设置 CMake 以与 Visual Studio 2017RC 和 CUDA 8.0 一起使用?

objective-c - NSCalibrateBlackColorSpace 的未弃用替代品?

ubuntu - 无法在 Ubuntu 中使用来自 CUDA 的 deviceQuery

cuda - openacc 与 openmp 和 mpi 的区别?

c++ - std::tr1::function 如何获取签名特征的参数并特化类*

c++ - 警告不精确的浮点常量

c++ - 我应该使用全局常量 vector 还是每次调用时返回该 vector 的函数

c# - *忽略* C++ 和 C# 如何在命令行中显示百分比

macos - 如何告诉 OS X 忽略来自两个连接的 USB 鼠标之一的输入?