OpenCL仅在AMD上:CL\u无效\u参数\u大小

OpenCL仅在AMD上:CL\u无效\u参数\u大小,opencl,amd,Opencl,Amd,我有一个内核,可以在我可以访问的所有平台上运行,但AMD app SDK 3.0和intel除外。 该平台是:OpenCL.Device(英特尔(R)核心(TM)i7-6700CPU@3.40GHz,基于AMD加速并行处理 MWE(很抱歉是在Julia中,但是调用应该与C中的调用几乎相同): 我已经确认了sizeof(astruct)的大小与内核中的大小匹配,但我仍然得到一个CL\u INVALID\u ARG\u size错误。这是一个bug还是我遗漏了什么?传递除简单类型之外的内核参数可能不

我有一个内核,可以在我可以访问的所有平台上运行,但AMD app SDK 3.0和intel除外。 该平台是:
OpenCL.Device(英特尔(R)核心(TM)i7-6700CPU@3.40GHz,基于AMD加速并行处理

MWE(很抱歉是在Julia中,但是调用应该与C中的调用几乎相同):


我已经确认了sizeof(astruct)的大小与内核中的大小匹配,但我仍然得到一个
CL\u INVALID\u ARG\u size
错误。这是一个bug还是我遗漏了什么?

传递除简单类型之外的内核参数可能不是官方功能的一部分。我见过它在某些平台上工作,但它取决于结构对齐是否相同,这通常是错误的事实并非如此。我建议传递单个参数,或者如果一个函数有一组相同类型的向量。这就是为什么我确保对齐是相同的;)顺便说一句,这是为了,它将Julia代码传输到OpenCL,处理任意结构是其中的一个关键部分-到目前为止,它在大多数架构上都运行得很好。我的意思是,这一直是一场噩梦,直到我最终让它在我可以访问的所有GPU OpenCL实现中工作:p据我所知,该标准没有特别提到按值传递聚合类型的内核参数,因此,我不清楚不支持它是否是实现中的一个bug,或者您是否只是期望出现未指定的行为。我会向AMD提交一份缺陷报告,看看他们怎么说。作为一种解决方法,您可以将结构复制到OpenCL内存缓冲区中,并通过引用传递它们?传递非简单类型的内核参数可能不是官方功能的一部分。我见过它在一些平台上工作,但它取决于结构对齐是否相同,而事实往往并非如此。我建议传递单个参数,或者如果a有一组相同类型的向量,那么就传递一个向量。这就是为什么我要确保对齐是相同的;)顺便说一句,这是for,它将Julia代码传输到OpenCL,处理任意结构是其中的一个关键部分,到目前为止,它在大多数体系结构上都工作得很好。我的意思是,这一直是一场噩梦,直到我最终让它在我可以访问的所有GPU OpenCL实现中工作:p据我所知,该标准没有特别提到按值传递聚合类型的内核参数,因此,我不清楚不支持它是否是实现中的一个bug,或者您是否只是期望出现未指定的行为。我会向AMD提交一份缺陷报告,看看他们怎么说。作为一种解决方法,您可以将结构复制到OpenCL内存缓冲区中,并通过引用传递它们?
using OpenCL
test_source = "
struct __attribute__((packed)) Test{
    float3 f1;
    int f2;
    float f3;
};
__kernel void structest(struct Test a){}
"
device = first(cl.devices())
ctx = cl.Context(device)
prg = cl.Program(ctx, source = test_source)
queue = cl.CmdQueue(ctx)
cl.build!(prg)
structkernel = cl.Kernel(prg, "structest")
astruct = ((1f0, 2f0, 3f0, 0f0), Int32(0), 22f0)

sizeof(astruct)
# == 24 exactly the same as what sizeof(struct Test a) in the kernel returns

astruct_boxed = Ref(astruct)
cl.@check cl.api.clSetKernelArg(structkernel.id, cl.cl_uint(0), sizeof(astruct), astruct_boxed)