我有一个带有简单数组声明和初始化的内核,以及一个额外的函数“get_smooth_vertex(...)”,我对其进行了更改以演示一个问题:
//More const __constant declarations
const __constant int edge_parents[12][2] = { {0,1}, {0,2}, {1,3}, {2,3}, {0,4}, {1,5}, {2,6}, {3,7}, {4,5}, {4,6}, {5,7}, {6,7} };
//More Functions
float3 get_smooth_vertex(const int edge_index, const float* cube_potentials) {
int i1 = edge_parents[edge_index][0];
int i2 = edge_parents[edge_index][1];
if (i1==i2) return (float3)(0);\n"
return (float3)(1);\n"
}
__kernel void march(const __global float* potentials, __global float* vertices, __global float* normals, const __constant float4* points, const int numof_points) {
//Lots of stuff.
//Call get_smooth_vertex(...) a few times
//More stuff.
}
“get_smooth_vertex(...)”中的 if 路径似乎总是被执行!现在,我无法想象为什么会这样,因为“edge_parents”中的每一对都是不同的。我检查了“edge_index”,它总是 >= 0 并且总是 <= 11。此外,没有一个变量在全局或局部范围内有别名。内核(和主机代码,FWIW)编译时没有警告或错误。
所以,我不知道出了什么问题——为什么索引会彼此相等?对齐,也许?我只是完全忘记了 C 是如何工作的吗?注意——这将是皇家用户错误。. .
谢谢,
伊恩