OpenCL C++ 中的 SVM 分配

SVM allocation in OpenCL C++

cl_contextcl::Context的情况下,我们可以这样做:

cl::Context context_ = cl::Context(device);
cl_context context = context_();

现在,我有一个 OpenCL 程序,其中包含以下代码片段:

...
void* svm_data = clSVMAlloc(context, svm_flags, svm_buffer_size, 0);
...

我想在这里做一些类似于我们在上面对 cl::Context 所做的事情(即从 header 中提取基础变量,或者在这种情况下,提取基础 void 指针):

cl::SVMAllocator svm_data_ = cl::SVMAllocator<int, cl::SVMTraitAtomic<>>(context);
void* svm_data = svm_data_();

但是翻了docs,一直没找到方法

有人有想法吗?

看起来您需要使用分配器分配共享虚拟内存以获取指向它的指针:

cl::SVMAllocator<int, cl::SVMTraitAtomic<>> svm_allocator(context);

std::size_t num_elements = 4;
int* svm_data = svm_allocator.allocate(num_elements);

SVM 分配器仅保存传递给clSVMAlloc() 的上下文和标志,如果要分配共享虚拟内存,需要直接调用allocate() 方法。另外,如果你想释放分配的内存,你也需要使用分配器:

svm_allocator.deallocate(svm_data, num_elements);