【问题标题】:CL_INVALID_KERNEL_NAME: when Struct in Kernel (Opencl)CL_INVALID_KERNEL_NAME:当内核中的 Struct (Opencl)
【发布时间】:2019-05-17 09:20:20
【问题描述】:

我正在尝试为 OpenCL 做 n-Body 练习。我为我的 bodyForce 函数使用了一个结构,我需要将它的一个实例作为该函数的参数。现在我正在尝试在我的内核文件中声明该结构,因为我的内核不知道该结构(显然)但是然后我得到了这个 OpenCL 错误:

#define CL_INVALID_KERNEL_NAME                      -46
  • 我检查了内核名称,它匹配
  • 我将内核名称更改为其他名称
  • 我使用了一个头文件,const char 指针,并在我的内核文件中实现了结构

代码:

Opencl 设置:

...
m_addKernel = clCreateKernel(m_program, "bodyForce", &err);
if (err != CL_SUCCESS)
{
    cout << err << endl;
    cout << "Error occured: clCreateKernel" << endl;
}
...

srcKernel.cl:

__kernel
typedef struct { float x, y, z, vx, vy, vz; } Body;
void bodyForce(__global Body *p, __global float *dtt, __global int *nn){
   float dt = *dtt;
   int n = *nn;
   for (int i = 0; i < n; i++) {
       float Fx = 0.0f; float Fy = 0.0f; float Fz = 0.0f;
       for (int j = 0; j < n; j++) {
            float dx = p[j].x - p[i].x;
            float dy = p[j].y - p[i].y;
            float dz = p[j].z - p[i].z;
            float distSqr = dx * dx + dy * dy + dz * dz + 1e-9f;
            float invDist = 1.0f / sqrtf(distSqr);
            float invDist3 = invDist * invDist * invDist;

        Fx += dx * invDist3;
        Fy += dy * invDist3;
        Fz += dz * invDist3;
    }

    p[i].vx += dt * Fx;
    p[i].vy += dt * Fy;
    p[i].vz += dt * Fz;
}

}

我认为其他事情并不重要,但如果我错过了什么,请告诉我!

提前致谢。


更新:

如果我像这样将我的结构设置在我的 __kernel 之上:

typedef struct { float x, y, z, vx, vy, vz; } Body;
__kernel
void bodyForce(__global Body *p, __global float *dtt, __global int *nn){
...
}

然后我收到此错误消息:

ptxas application ptx input, line 94; error   : Type of argument does not match formal parameter '%VAParam'
ptxas application ptx input, line 135; error   : Type of argument does not match formal parameter '%VAParam'
ptxas application ptx input, line 176; error   : Type of argument does not match formal parameter '%VAParam'
ptxas application ptx input, line 222; error   : Type of argument does not match formal parameter '%VAParam'
ptxas application ptx input, line 259; error   : Type of argument does not match formal parameter '%VAParam'
ptxas application ptx input, line 296; error   : Type of argument does not match formal parameter '%VAParam'
ptxas application ptx input, line 333; error   : Type of argument does not match formal parameter '%VAParam'
ptxas fatal   : Ptx assembly aborted due to errors

【问题讨论】:

  • 这似乎是一个编译器错误。我建议购买一个最小的复制器并联系 Nvidia 支持。
  • 我可能会首先通过不同的 OpenCL 实现(英特尔、AMD 等)运行它并检查我们是否遗漏了任何东西,但如果代码在那里编译得很好,我同意与@AndrewSavonichev 一起,输出表明存在编译器错误。

标签: c++ kernel opencl


【解决方案1】:

你需要在函数定义前加上__kernel属性:

typedef struct { float x, y, z, vx, vy, vz; } Body;

__kernel
void bodyForce(__global Body *p, __global float *dtt, __global int *nn) {
}

【讨论】:

猜你喜欢
  • 2023-02-18
  • 1970-01-01
  • 2011-12-06
  • 2017-11-05
  • 2019-04-19
  • 2018-07-20
  • 1970-01-01
  • 2014-10-28
  • 2019-12-10
相关资源
最近更新 更多