我有一些OpenCL代码需要atomic_cmpxchg
之类的操作,但需要int4
(或long2
),而不仅仅是int
或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 *,它指向第一个(或任何其他)组件矢量。
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;
}
答案 0 :(得分:1)
您可以使用联合,而不是强制转换,例如:
typedef struct
{
union
{
int4 m_vecInt;
int m_ints[4];
}
} MyIntCastingType;
int4 atomicCAS(__global MyIntCastingType *place, int4 new_val)
{
int4 old = place->m_vecInt;
if (atomic_cmpxchg(&place->m_ints[0], 0, new_val.x) == 0)
{
place->m_vecInt = new_val;
}
}