【问题标题】:How do you flatten image coordinates into a 1D array?如何将图像坐标展平为一维数组?
【发布时间】:2013-07-31 05:31:42
【问题描述】:

我的源代码来自Heterogeneous Computing with OpenCL Chapter 4 Basic OpenCL Examples > Image Rotation。这本书遗漏了几个关键细节。

我的主要问题是我不知道如何初始化我提供给他们内核的数组(他们没有告诉你如何)。我有的是:

int W = inImage.width();
int H = inImage.height();
float *myImage = new float[W*H];
    for(int row = 0; row < H; row++)
        for(int col = 0; col < W; col++)
            myImage[row*W+col] = col;

我提供给这个内核的:

    __kernel void img_rotate(__global float* dest_data, __global float* src_data, int W, int H, float sinTheta, float cosTheta) 
{
    const int ix = get_global_id(0);
    const int iy = get_global_id(1);
    float x0 = W/2.0f;
    float y0 = H/2.0f;
    float xoff = ix-x0;
    float yoff = iy-y0;
    int xpos = (int)(xoff*cosTheta + yoff*sinTheta + x0);
    int ypos = (int)(yoff*cosTheta - xoff*sinTheta + y0);
    if(((int)xpos>=0) && ((int)xpos < W) && ((int)ypos>=0) && ((int)ypos<H))
    {
        dest_data[iy*W+ix] = src_data[ypos*W+xpos];
        //dest_data[iy*W+ix] = src_data[iy*W+ix];
    }
}

我也很难找到正确的 theta 值。整数应该是 theta 的合适值,对吧?

float theta = 45; // 45 degrees, right?
float cos_theta = cos(theta);
float sin_theta = sin(theta);

【问题讨论】:

  • cossin 始终接受弧度 - 您应该将 45 度转换为弧度

标签: graphics opencl


【解决方案1】:

在编写我的 OpenCL 代码时,我总是将每个内核视为读取一组 3D 数据,无论数据是 1D、2D 还是 3D:

 __kernel void TestKernel(__global float *Data){
      k = get_global_id(0); //also z
      j = get_global_id(1); //also y
      i = get_global_id(2); //also x

      //Convert 3D to 1D
      int linear_coord = i + get_global_size(0)*j + get_global_size(0)*get_global_size(1)*k;

      //do stuff
 }

在执行 clEnqueueNDKernelRange(...) 时,只需将维度设置为:

 int X = 500;
 int Y = 300;
 int Z = 1;

 size_t GlobalDim = {Z, Y, X};

这让我的所有内核都可以在各个维度上轻松工作。

【讨论】:

    猜你喜欢
    • 2015-07-21
    • 2011-02-03
    • 2019-11-27
    • 1970-01-01
    • 2013-11-19
    • 1970-01-01
    • 2014-09-10
    • 2015-12-31
    • 2011-07-26
    相关资源
    最近更新 更多