0

我有一些atomic_cmpxchg需要类似操作的 OpenCL 代码,但是 for int4(or long2) 而不是intor 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;
}
4

1 回答 1

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;
    }
}
于 2012-07-07T03:47:50.923 回答