【问题标题】:Writing to Global Memory Causing Crash in OpenCL in For Loop在 For 循环中写入全局内存导致 OpenCL 崩溃
【发布时间】:2020-09-20 08:55:43
【问题描述】:

我的一个 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, x, 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, x, z) != population_seed_state) { continue; }

    world_seeds[global_id] = (a << 32) + k; //DOES NOT WORK HERE
}

【问题讨论】:

  • 这可能是代码中其他地方的错误(导致未定义的行为)。我认为您没有提供足够的信息来调试此问题。
  • 事实证明,它出现在我的代码中的语句之一,而技术上正确的 OpenCL 导致我的硬件出现一个模糊的错误“AMD HSA 代码对象加载失败”

标签: opencl


【解决方案1】:

实际上存在导致代码中未定义行为的错误,特别是主反转内核在参数中包含一个名为“增量”的变量,并且在同一个内核中我定义了另一个名为增量的变量。它编译得很好,但导致完全错误的结果和内存崩溃。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2014-05-07
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-06-16
    • 2019-08-19
    相关资源
    最近更新 更多