缓冲区内的 SYCL 缓冲区
SYCL buffers within buffers
假设我有以下包含缓冲区的结构:
struct SomeAllocatorCode {
int* rawData;
size_t rawDataSize;
cl::sycl::buffer<int> nestedBuffer;
SomeAllocatorCode(int* rawData, size_t size): rawData(rawData),
rawDataSize(rawDataSize), nestedBuffer(rawData, cl::sycl::range<1>(rawDataSize)) {}
};
然后我想像这样创建一个缓冲区:
int* data = new int[64];
SomeAllocatorCode* allocator = new SomeAllocatorCode(data, 64);
cl::sycl::buffer<SomeAllocatorCode> topLevelBuffer(allocator,
cl::sycl::range<1>(1));
我将如何从设备代码中读取 nestedBuffer
?是否可以像这样构造数据?像往常一样使用数据访问器并在使用读取访问器访问 topLevelBuffer
后简单地获取 nestedBuffer
的数据访问器就足够了吗?
我建议您了解内存缓冲区和访问器在 SYCL 中的工作方式,这将帮助您采用最佳方法来完成您正在尝试做的事情。
以下是一些有用资源的链接:
这里是一个如何使用嵌套占位符访问器解决这个问题的示例:
如该答案所述,位于设备缓冲区中的后续访问器不起作用,因此目前无法进行多级间接访问。
假设我有以下包含缓冲区的结构:
struct SomeAllocatorCode {
int* rawData;
size_t rawDataSize;
cl::sycl::buffer<int> nestedBuffer;
SomeAllocatorCode(int* rawData, size_t size): rawData(rawData),
rawDataSize(rawDataSize), nestedBuffer(rawData, cl::sycl::range<1>(rawDataSize)) {}
};
然后我想像这样创建一个缓冲区:
int* data = new int[64];
SomeAllocatorCode* allocator = new SomeAllocatorCode(data, 64);
cl::sycl::buffer<SomeAllocatorCode> topLevelBuffer(allocator,
cl::sycl::range<1>(1));
我将如何从设备代码中读取 nestedBuffer
?是否可以像这样构造数据?像往常一样使用数据访问器并在使用读取访问器访问 topLevelBuffer
后简单地获取 nestedBuffer
的数据访问器就足够了吗?
我建议您了解内存缓冲区和访问器在 SYCL 中的工作方式,这将帮助您采用最佳方法来完成您正在尝试做的事情。 以下是一些有用资源的链接:
这里是一个如何使用嵌套占位符访问器解决这个问题的示例: