我有一些atomic_cmpxchg
需要类似操作的 OpenCL 代码,但是 for int4
(or long2
) 而不是int
or long
。经过几次尝试,我没有设法创建它,谷歌搜索对我没有任何用处。我的代码现在看起来像这样:
int4 atomicCAS(__global int4 *place, int4 new_val)
{
int4 old = *place;
if (atomic_cmpxchg((int*)place, 0, new_val.x) == 0)
{
*place = new_val;
}
return old;
}
它检查该位置是否包含零向量并使用有关数据的一些附加知识:在非零int4
向量中,所有分量均非零。
但是,这段代码不起作用,我无法让它工作:似乎没有办法将 int4* 转换为 int*,它指向向量的第一个(或任何其他)分量。
升级版:
而且,当然,我也对执行此操作的一般方法感兴趣,而无需对数据有这样的了解。
UPD2:
首次发布的代码不是原子的。更正版本(它有效,使用第一个答案):
typedef union
{
int4 m_int4;
int m_ints[4];
} int4ints;
int4 atomicCAS(__global int4ints *p, int4 new_val)
{
int4 old;
if (atomic_cmpxchg(&p->m_ints[0], 0, new_val.x) == 0)
{
p->m_int4 = new_val;
old = 0;
} else
{
old = p->m_int4;
}
return old;
}