将 OpenCL 函数更改为C++

Change OpenCL function to C++

本文关键字:C++ OpenCL 函数      更新时间:2023-10-16

我正在尝试用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"吗?以及如何更改上述其他功能?谁能帮忙?谢谢。

一般来说,你应该看看OpenCL规范(我假设它是用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修饰符。

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++)