list - 使用 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() 检查写入是否正确。
同样使结构易变也不会改变任何东西。
提前致谢!
解决方案
我自己解决了。这是一个同步问题。
推荐阅读
- python - 导入类与导入定义 python
- spring-boot - Spring Security OAuth2 是否支持带有 PKCE 的浏览器(Angular)客户端的授权代码流?
- swift - 有没有办法在不重复自己的情况下声明通知名称?
- javascript - JavaScript:使用 for 循环将列表推送到具有原始重复值的新列表
- python - Python、Flask 和 Jinja - 如何使用组输出查询
- javascript - 使用 JavaScript 切换 CSS 类无法生成动画
- rust - 在 Rust 中设置结构构造函数的类型
- c# - WPF 指定绑定时如何生成列
- excel - 复杂的excel问题,解析字符串然后从匹配单元格旁边的单元格中获取最大日期
- c - 什么是 htonl 的“to little endian”等价物?