1

私は CUDA Raytracer を書いていますが、奇妙な問題で立ち往生しているようです。Mac OS X で GCC4.2.1 とともに CUDA 5.5 を使用しており、GLM 0.9.4.4 を使用しています。raycastFromCameraKernel 関数を呼び出すたびに、次のエラーが発生します。

Cuda エラー: カーネルが失敗しました!: OS 呼び出しが失敗したか、この OS では操作がサポートされていません。

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

誰か助けてくれませんか?

4

1 に答える 1

0

したがって、問題は、距離 u と V の特定の値の一時値が非常に少ない (ゼロに近い) ためにゼロ除算エラーが発生し、これが glm::normalize でゼロ除算エラーを引き起こしていたことです。これを解決するには、正規化する前に temp の値をチェックし、特定のしきい値を超えている場合にのみ正規化しました。これで問題は解決しました。

于 2013-08-17T16:45:18.320 に答える