我目前正在OpenCL中使用分层的八度噪声实现地形生成,我偶然发现了这个问题:
float multinoise2d(float2 position, float scale, int octaves, float persistence)
{
float result = 0.0f;
float sample = 0.0f;
float coefficient = 1.0f;
for(int i = 0; i < octaves; i++){
// get a sample of a simple signed perlin noise
sample = sgnoise2d(position/scale);
if(i > 0){
// Here is the problem:
// Implementation A, this works correctly.
coefficient = pown(persistence, i);
// Implementation B, using this only the first
// noise octave is visible in the terrain.
coefficient = persistence;
persistence = persistence*persistence;
}
result += coefficient * sample;
scale /= 2.0f;
}
return result;
}
OpenCL是否并行化for循环,导致同步问题或者我错过了其他什么?
感谢任何帮助!
答案 0 :(得分:3)
代码的问题在于
行coefficient = persistence;
persistence = persistence*persistence;
应该改为
coefficient = coefficient *persistence;
否则每次迭代
第一个系数只是通过持久性增长
pow(persistence, 1) ; pow(persistence, 2); pow(persistence, 3) ....
然而第二个实现
pow(persistence, 1); pow(persistence, 2); pow(persistence, 4); pow(persistence, 8) ......
很快“持久性”将超过浮动限制,你将在答案中得到零(或未定义的行为)。
EDIT 还有两件事
答案 1 :(得分:1)
我假设这是在CL内核中调用的某种实用方法。 Vivek在上面的评论中是正确的:OpenCL没有为您的代码并行化。您必须利用OpenCL的工具将问题划分为数据并行块。
此外,我在上面的代码中没有看到潜在的同步问题。所有变量都在工作项私有内存空间中。