矢量原子

时间:2012-07-06 14:51:50

标签: opencl atomic

我有一些OpenCL代码需要atomic_cmpxchg之类的操作,但需要int4(或long2),而不仅仅是intlong。经过几次尝试,我没有设法创建它,谷歌搜索没有给我带来任何帮助。我的代码现在看起来像这样:

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;
}

1 个答案:

答案 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;
    }
}