如何解决在For Loop中写入OpenCL中导致崩溃的全局内存
我的OpenCL辅助函数之一可以在一个地方写入全局内存,并且运行正常,内核通常执行。尽管如此,当直接从该行之后运行时,它冻结/崩溃了内核,而我的程序无法运行。
此函数中的值发生变化(NDRange的值不同,为2 ^ 16),因此循环也发生变化,并且由于条件的原因,并非所有线程都可以执行相同的代码。
为什么这是一个问题?我是否缺少某种内存阻塞之类的东西?
void add_world_seeds(yada yada yada....,const uint global_id,__global long* world_seeds)
for (; indexer < (1 << 16); indexer += increment) {
long k = (indexer << 16) + c;
long target2 = (k ^ e) >> 16;
long second_addend = get_partial_addend(k,x,z) & MASK_16;
if (ctz(target2 - second_addend) < mult_trailing_zeroes) { continue; }
long a = (((first_mult_inv * (target2 - second_addend)) >> mult_trailing_zeroes) ^ (J1_MUL >> 32)) & mask;
for (; a < (1 << 16); a += increment) {
world_seeds[global_id] = (a << 32) + k; //WORKS HERE
if (get_population_seed((a << 32) + k,z) != population_seed_state) { continue; }
world_seeds[global_id] = (a << 32) + k; //DOES NOT WORK HERE
}
}
for (; a < (1 << 16); a += increment) {
world_seeds[global_id] = (a << 32) + k; //WORKS HERE
if (get_population_seed((a << 32) + k,z) != population_seed_state) { continue; }
world_seeds[global_id] = (a << 32) + k; //DOES NOT WORK HERE
}
解决方法
事实上,存在一个导致代码中未定义行为的错误,特别是主反向内核在参数“ increment”中包含一个变量,并且在同一内核中,我定义了另一个变量increment。它编译得很好,但是完全导致了错误的结果和内存崩溃。
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。