2012-07-06 65 views
0

我有其中需要像atomic_cmpxchg操作一些OpenCL的代码,但是对于int4(或long2),而不是仅仅intlong。经过几次尝试,我没有设法创建它,并且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; 
} 

回答

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

为什么你定义一个结构,我不能得到的原因工会内部,而不仅仅是一个工会。是否有可能保留函数签名?我试着改变你的变体来接受'int4 *',但是失去了原子性。 – aplavin 2012-07-07 08:10:27