2016-01-22 66 views
0

我在pyopenCL中編寫了一個openCL內核,我想在其中尋址向量元素。C/openCL中的向量元素

在普通的C,結果我想有是:

int i = 0; 
float *vec = (float*)maalloc(sizeof(float)*4); 
for (i=0;i<4;i++) 
{ 
    vec[i]=2*i; 
} 

在OpenCL中,向量的元素在一個「Python的」點的語法式被存取。

float4 vec = (float4)(0); 
for (i=0;i<4,i++) 
{ 
    vec.si = 2*i; 
/*obviously doesn't work*/ 
} 

vec[2]所以成爲在OpenCL中vec.s2,所以它不再直接的具有可變訪問的元素。然而,如何使用變量訪問vector元素呢?

+0

如果您想使用數組操作來訪問它,請使用數組。用[]訪問矢量是不可能的。因爲元素訪問需要在編譯時爲矢量知道。 – M4rtini

+0

http://stackoverflow.com/questions/9788806/access-vector-type-opencl看到這個一些hacky解決方案 – M4rtini

+0

你可以使用'vec.s [i]'。但是,爲什麼要使用矢量然後再分割它們?這破壞了矢量的目的。只需要執行'vec = vec *(float4)(0,2,4,6);' – DarkZeros

回答

1

OpenCL支持主機端組件和設備端組件(內核)的C,因此您可以使用float陣列編寫與第一個示例幾乎完全相同的內核。內核可能看起來像下面這樣:

__kernel void vectorAddition(__global float* vec) { 
    // Get the global thread id in x dimension(eliminates loop) 
    size_t index = get_global_id(0); 

    vec[index] = 2.0f * index; 
} 

然後你就可以指定使用使這樣做是爲了在陣列中的每個元素(使相同數量的線程作爲數組中的元素)的線程數。

OpenCL確實允許使用點符號進行訪問,但是這是訪問vector data types的元素。矢量數據類型可以提高性能,因爲可以同時對矢量數據類型的所有元素執行相同的操作。

例如,float4是一種矢量數據類型,它將四個32位浮點數相鄰存儲以構成一個128位結構。然後,您可以一次對所有4個浮標執行操作。

例如:

float4 v = (float4)(1.0f, 2.0f, 3.0f, 4.0f); 
float4 mult_result = v * 2; 

它只需一個指令同時執行四個乘法。 mult_result然後具有值{2.0f, 4.0f, 6.0f, 8.0f}

的點標記然後可以用於訪問float4變量的組分,例如:

float a = v.x;   // a = 1.0f 
float b = mult_result.y; // b = 4.0f 

這裏是矢量數據類型的彙總:Vector Data Type Overview