gpt4 book ai didi

c - OpenCl 内核返回异常巨大的数字

转载 作者:太空宇宙 更新时间:2023-11-03 23:36:51 26 4
gpt4 key购买 nike

一段时间以来,我一直在尝试使用 OpenCL 内核将我的 Marching Cubes 算法从 CPU 转移到 GPU。

我遇到的问题是我的内核中的一个函数返回了奇怪的值,所以我写了一个测试用例,我在一个包含 12 个 float3 的数组中指定了可能的返回值,其中 float3 组件为 0、0.5 和 1 (见下面的代码)

出于某种原因,我得到的数字非常大,例如“11”的 edgeIndex 返回 float3:(-145085952., 6.600e-43#DEN, 0) 而它应该是 (1, 0, 0.5)。据我所知,y 坐标基本上是 0,所以这不是问题,但 x 坐标让我头疼。

起初我认为 OpenCL 在将给定值转换为 float3 时可能有问题,所以我用“.f”指定它们(例如 (float3)(0.f, 0.5f, 0.f))。这只会导致更加奇怪和不同的结果,这让我觉得我必须在某个地方犯错误。我是 OpenCL 的新手(这是我使用它的第一个真正的项目)而且我一般编程也没有那么长时间所以我希望我不会在这里犯一些新手错误但我试图解决这个问题和相关问题好几天了,我找不到解决方案。

我尽可能地缩小了问题的范围,并测试了代码是否在执行它所采取的每个步骤时都在执行它应该执行的操作。在“CalculateEdgePos”函数调用之前,一切似乎都很顺利,我得到了预期的结果。我删除了所有不必要代码的功能(因此您可以忽略“值”参数,因为它现在没有被使用)但现在我束手无策。

返回奇怪结果的函数:

float3 CalculateEdgePos(int edgeIndex, __global int* values) 
{
if(edgeIndex == -1)
{
return (float3)(-1,-1,-1);
}

float3 EdgePositions[12] = {(float3)(0, 0.5, 0), (float3)(0.5, 1, 0), (float3)(1, 0.5, 0), (float3)(0.5, 0, 0), (float3)(0, 0.5, 1), (float3)(0.5, 1, 1), (float3)(1, 0.5, 1), (float3)(0.5, 0, 1), (float3)(0, 0, 0.5), (float3)(0, 1, 0.5), (float3)(1, 1, 0.5), (float3)(1, 0, 0.5)};

return EdgePositions[edgeIndex];
}


and the part of the kernel with the function call and the result getting send back to the CPU
(edgeIndex is calculated fine beforehand):

__kernel void MarchCubes(__global float* outVertices, __global int* values, __global int* edges)
{
.
.
.
float3 vertexPos = CalculateEdgePos(edgeIndex, values);
float coords[3] = {vertexPos.x, vertexPos.y, vertexPos.z};

outVertices[get_global_id(0)] = coords[coordIndex];
}

如果你们中的任何人可以提供任何提示或帮助,我将不胜感激。如果您需要更多代码片段,请告诉我,但我认为这应该足够了,因为只有指定的函数行为异常。

亲切的问候,美食家

最佳答案

当然,在我发布这个我已经坐了这么久的问题之后,我找到了解决方案...

所以如果有人有类似的问题:

如果您在数组本身的声明中正确声明数组元素,OpenCL 似乎真的不喜欢它。所以不要写:

 float3 EdgePositions[12] = {(float3)(0, 0.5, 0), (float3)(0.5, 1, 0), (float3)(1, 0.5, 0), (float3)(0.5, 0, 0), (float3)(0, 0.5, 1), (float3)(0.5, 1, 1), (float3)(1, 0.5, 1), (float3)(0.5, 0, 1), (float3)(0, 0, 0.5), (float3)(0, 1, 0.5), (float3)(1, 1, 0.5), (float3)(1, 0, 0.5)};

我现在写道:

float3 pos0 = (float3)(0.f, 0.5f, 0.f);
float3 pos1 = (float3)(0.5f, 1.f, 0.f);
float3 pos2 = (float3)(1.f, 0.5f, 0.f);
float3 pos3 = (float3)(0.5f, 0.f, 0.f);
float3 pos4 = (float3)(0.f, 0.5f, 1.f);
float3 pos5 = (float3)(0.5f, 1.f, 1.f);
float3 pos6 = (float3)(1.f, 0.5f, 1.f);
float3 pos7 = (float3)(0.5f, 0.f, 1.f);
float3 pos8 = (float3)(0.f, 0.f, 0.5f);
float3 pos9 = (float3)(0.f, 1.f, 0.5f);
float3 pos10 = (float3)(1.f, 1.f, 0.5f);
float3 pos11 = (float3)(1.f, 0.f, 0.5f);

float3 EdgePositions[12] = {pos0, pos1, pos2, pos3, pos4, pos5, pos6, pos7, pos8, pos9, pos10, pos11};

现在它就像一个魅力。

我仍然不明白为什么不允许这样做或返回错误值,所以如果有人知道并愿意详细说明,我将非常感激。

关于c - OpenCl 内核返回异常巨大的数字,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58302009/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com