2014-02-19 56 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++)