首页 > 解决方案 > 使用 atomics 将项目添加到 openCL 中的链表会在 uint 中提供混合字节

问题描述

我在使用 openCL atomics 时遇到了一个大问题,我无法再进一步了。不幸的是,我在 GPU/openCL 编程方面没有经验。有人可以帮忙吗?

我的代码看起来像这样:

typedef struct Item {
  uint ID;
  uint parentID;
  uint childID;
};

void listAdd(global struct Item* parent, global struct Item* child) {
  uint oldChildID = atomic_xchg(&parent->childID, child->ID);
  atomic_cmpxchg(&child->parentID, EMPTY, parent->ID); // line:a
  global struct Item* oldChild = getItem(oldChildID);
  // uint A = child->parentID;
  if (oldChild) {
    child->childID = oldChildID;
    atomic_cmpxchg(&oldChild->parentID, parent->ID, child->ID); // line:b
  }
  // uint B = child->parentID;
  ...
  // uint C = child->parentID;
}

我相信这应该有效,但事实并非如此。由于在不同工作项中的不同代码(“line:a”和“line:b”)行中对同一项目使用了 ->parentID,因此应该会出现问题。

该函数给出了这个:

A==00001011 00001101 11100010 11100101
B==00001101 00001101 11100010 11100101
C==00001101 00000110 01000100 01001110

A 是此工作项在“line:a”中分配的正确值。C 可能来自“line:b”中的另一个工作项。但是 B(有时在没有到达 C 的情况下“存活”)是最高字节(左一个)和其他三个字节的混合。

我猜这是至少两个工作项同时写入全局内存的结果,但是:我正在使用原子函数,我什至正在通过 atomic_cmpxchg() 检查写入是否正确。

同样使结构易变也不会改变任何东西。

提前致谢!

标签: listopenclatomic

解决方案


我自己解决了。这是一个同步问题。


推荐阅读