2014-02-19 55 views
1

我想用C++編寫代碼,但在Internet上進行了一些搜索之後,發現一個基於OpenCL的代碼與C++中要執行的操作完全相同。但因爲這是我第一次看到的OpenCL代碼,我不知道如何改變下列功能爲C++:將OpenCL函數更改爲C++

const __global float4 *in_buf; 

int x = get_global_id(0); 
int y = get_global_id(1); 

float result = y * get_global_size(0); 

在C「const __global float4 *in_buf」等同於「const float *in_buf」 ++?以及如何改變上述其他功能?誰能幫忙?謝謝。

回答

3

一般來說,您應該看看the OpenCL specification(我假設它是用OpenCL 1.x編寫的),以便更好地理解函數,類型和內核的工作方式。

專門針對你的問題:

get_global_id返回當前工作項目的ID,並get_global_size返回的工作項的總數。由於在OpenCL工作項是大致相當於在連續語言單次迭代,OpenCL的的等價的:

int x = get_global_id(0); 
int y = get_global_id(1); 
// do something with x and y 
float result = y * get_global_size(0); 

將是C的:

for (int x = 0; x < dim0; x++) { 
    for (int y = 0; y < dim1; y++) { 
     // do something with x and y 
     float result = y * dim0; 
    } 
} 

至於float4它是4的向量類型浮點數,大致相當於C的float[4](除了它支持許多額外的運算符,如矢量運算)。當然,在這種情況下,它是一個緩衝區,所以適當的類型將是float**float[4]* - 或者更好,只需將它們打包到一個float*緩衝區中,然後一次加載4個緩衝區。

隨意忽略__global修飾符。

+2

+1更換;但我會說'float4'更接近於'std :: array ' - 它可以被分配和複製。 – Angew

+0

也許它等價於__m128內在變量? –

2

const __global float4 *in_buf不等於const float *in_buf。 OpenCL使用矢量變量,例如floatN,其中N例如是2,4,8。所以float4實際上是struct { float w, float x, float y, float z}有很多可用來表達矢量操作的技巧。

get_global_id(0)給你的迭代變量,所以基本上每個get_global_id(dim)for(int x = 0; x< max[dim]; x++)