在 OpenCL 内核中使用模板化结构作为参数

问题描述 投票:0回答:1

我遇到了一个问题,如果您能帮助我解决问题,我将非常感激。

我尝试使用

clang-17
编译下面看到的代码片段,但出现错误:

openclTemplateTest.hpp:12:68: error: '__global MyTemplatedTestStructWithSize *__private' (aka '__global MyTemplatedTestStruct<32> *__private') cannot be used as the type of a kernel parameter

clang
参数的完整列表如下:

/usr/lib/llvm-17/bin/clang++ -c -cl-std=clc++ -target spir64 -emit-llvm -fcolor-diagnostics -Xclang -finclude-default-header -I[some header includes for OpenCL-C++] openclTemplateTest.hpp -o bitcode_out.bc

第一个猜测是 OpenCL 内核不支持模板化结构数组作为参数,但这不是真的,不是吗?至少我在文档中找不到类似的限制。如果一般情况下是允许的,我做错了什么?是地址空间问题吗?我对错误

clang
生成的错误消息感到困惑(为什么它会在那里抛出
__private
?)

提前非常感谢您!

有问题的代码:

template<unsigned int NUM_BLOCKS>
struct MyTemplatedTestStruct
{
    int data[NUM_BLOCKS];
};

typedef MyTemplatedTestStruct<32> MyTemplatedTestStructWithSize;

kernel void myTestFunction(__global MyTemplatedTestStructWithSize* myArgument)
{
    for (unsigned int i = 0; i < 5; ++i)
    {
        myArgument->data[i] = 42; // completely nonsensical, just for testing purposes
    }
}
c++ templates opencl
1个回答
0
投票

正如回复中所指出的,问题是一个

clang
bug,使得内核参数诊断“过于保守,有时甚至不正确”。

一种解决方案是告诉

clang
允许在内核参数中使用受限类型,如下所述:https://clang.llvm.org/docs/LanguageExtensions.html#cl-clang-non-portable-kernel -参数类型

另一种解决方案是在类声明之后通过

template class MyTemplatedTestStruct<32>;
实例化模板类。

© www.soinside.com 2019 - 2024. All rights reserved.