0
我有其中需要像atomic_cmpxchg
操作一些OpenCL的代码,但是对于int4
(或long2
),而不是仅仅int
或long
。经过几次尝试,我没有设法创建它,并且Google对我没有任何帮助。我的代码现在看起来像这样:原子公司为矢量
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 *,它指向向量的第一个(或任何其他)组件。
UPD:
,当然,我也有兴趣在一般的方式来做到这一点,如果没有有关数据,例如知识。
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;
}
为什么你定义一个结构,我不能得到的原因工会内部,而不仅仅是一个工会。是否有可能保留函数签名?我试着改变你的变体来接受'int4 *',但是失去了原子性。 – aplavin 2012-07-07 08:10:27