OpenCL 内核_local内存行为不正确
OpenCL Kernel _local memory not behaving correctly
我这里有一个测试内核,我从Julia OpenCL API调用。 我从 Julia 调用它的事实并不重要,这只是我用来运行 OpenCL 的内容,这是代码:
using OpenCL
const cl = OpenCL
device, ctx, queue = cl.create_compute_context()
C_buff = cl.Buffer(Float32, ctx, :w, 2)
const testkernel = """
kernel void test(global float *C)
{
int gid = get_global_id(0);
int lid = get_local_id(0);
local float x;
if (lid == 0)
{
x = 0.0f;
}
barrier(CLK_LOCAL_MEM_FENCE);
x += 1.0f;
barrier(CLK_LOCAL_MEM_FENCE);
if (lid == 0)
{
C[gid / 2] = x;
}
}
"""
program = cl.Program(ctx, source=testkernel) |> cl.build!
kernel = cl.Kernel(program, "test")
cl.call(queue, kernel, 4, 2, C_buff)
cl.read(queue, C_buff)
我无法弄清楚的是这返回了一个向量[1.0,1.0]
,而它似乎应该返回向量[2.0,2.0]
。 因为基本上我有 4 个工作项目分为两个工作组(每个工作组包含 2 个工作项目)。
为每个工作组实例化一个本地浮点x
,每个工作组中的第一个工作项将其设置为 0。 然后工作组中的每个工作项都向其添加 1,并且由于每个工作组中有两个工作项,因此它应该是 2,但是当我返回 C
时,我得到了一个向量 1。
barrier(CLK_LOCAL_MEM_FENCE); x += 1.0f; barrier(CLK_LOCAL_MEM_FENCE);
障碍不是互斥锁。您有一个数据争用,其中两个工作项尝试同时写入同一变量。
您必须使用原子或重新设计代码。
相关文章:
- 使用2个键的cpp-stl::优先级队列排序不正确
- 正弦级数方程计算不正确
- 我试图制作一个程序,要求用户输入问题和答案,但程序循环不正确
- 密码登录程序将永远循环并显示不正确的结果
- 在C++中返回不正确的楼层函数值
- 形状对象的旋转和缩放不正确C++
- C++ 读取文件读取文件不正确
- 关于类的 Python 文档 - 对C++的引用不正确
- std::unordered_map析构函数不释放内存?
- 特征 LLT 模块给出不正确的结果?
- glibcxx STL 在实现 std::valarray::sum() 时是否不正确?
- 我是否访问了已释放的内存,或者在这种情况下DrMemory报告不正确?
- 不正确的 Vulkan 统一缓冲区内存对齐
- Valgrind 未显示使用不正确的 c_str() 的无效内存访问
- 如何正确关闭QWebView而不导致内存泄漏
- 使用结构数组分配不正确的内存
- 从浮点到十六进制的转换在写入内存时不正确
- 动态多态内存容器-返回值不正确
- top可能显示内存使用不正确
- OpenCL 内核_local内存行为不正确