2012-03-20 75 views
7

我有whithin變量的內核,如:訪問向量類型的OpenCL

int16 element; 

我想知道如果有ADRESS的元素像

element[2],這樣我就第三INT方式像寫作作爲同一element.s2

所以,我怎樣才能做這樣的事情:

int16 element; 
int vector[100] = rand() % 16; 

for (int i=0; i<100; i++) 
    element[ vector[i] ]++; 

我做的方法是:

int temp[16] = {0}; 
int16 element; 
int vector[100] = rand() % 16; 

for (int i=0; i<100; i++) 
    temp[ vector[i] ]++; 


element = (int16)(temp[0],temp[1],temp[2],temp[3],temp[4],temp[5],temp[6],temp[7],temp[8],temp[9],temp[10],temp[11],temp[12],temp[13],temp[14],temp[15]); 

我知道這是可怕的,但它的工作原理,;-)

+0

您可以使用結構和數組就像在C:'INT16元素[3];'或許我不明白的問題.. 。 – pezcode 2012-03-20 18:47:07

+4

他不問載體的陣列。他詢問使用數組符號訪問矢量的組件。 – vocaro 2012-03-20 21:16:20

回答

11

那麼還有骯髒的方式:),我希望的OpenCL提供了更好的方法遍歷矢量元素。

這是我做這件事的方式。

union 
    { 
     int elarray[16]; 
     int16 elvector; 
    } element; 

//traverse the elements 
for (i = 0; i < 16; i++) 
element.elarray[i] = temp[vector[i]]++; 

在OpenCL內核中,rand函數不可用,你是如何使它工作的?

+1

大聲笑...很好!好多了,我忘了工會! 關於蘭特,這只是一個例子,我的矢量充滿以外的設備。 謝謝 – Caslu 2012-03-21 12:33:16

4

可能的,但它不是那樣有效的直接陣列訪問。

float index(float4 v, int i) { 
    if (i==0) return v.x; 
    if (i==1) return v.y; 
    if (i==2) return v.z; 
    if (i==3) return v.w; 
} 

但是,當然,如果您需要以這種方式進行組件式訪問,那麼您可能最好不要使用向量。

4

我使用此解決方法,希望編譯器非常聰明,明白我的意思(我覺得元素訪問是一個嚴重的失誤形成的標準):

int16 vec; 
// access i-th element: 
((int*)vec)[i]=...; 
8

AMD recommends越來越矢量分量是這樣的:

把口罩的陣列到OpenCL的常量緩衝區:

cl_uint const_masks[4][4] = 
{ 
    {0xffffffff, 0, 0, 0}, 
    {0, 0xffffffff, 0, 0}, 
    {0, 0, 0xffffffff, 0}, 
    {0, 0, 0, 0xffffffff}, 
} 

內核裏面寫這樣的事情:

uint getComponent(uint4 a, int index, __constant uint4 * const_masks) 
{ 
    uint b; 
    uint4 masked_a = a & const_masks[index]; 
    b = masked_a.s0 + masked_a.s1 + masked_a.s2 + masked_a.s3; 
    return (b); 
} 

__kernel void foo(…, __constant uint4 * const_masks, …) 
{ 
    uint4 a = ….; 
    int index = …; 
    uint b = getComponent(a, index, const_masks); 
} 
+0

是否從一個不同的存儲庫加載一個常量緩衝區而不是全局緩衝區?或者他們都共享相同的記憶線? – 2014-10-03 13:45:26

+1

這是獨家前GCN?你知道它是否符合標準,或者至少在更新的AMD中仍然推薦和支持它? – Michele 2017-03-03 09:40:54

6

使用指針是一個非常簡單的解決方案

float4 f4 = (float4)(1.0f, 2.0f, 3.0f, 4.0f); 

int gid = get_global_id(0); 


float *p = &f4; 

result[gid]=p[3];