gpt4 book ai didi

c++ - OpenCL C++ 包装器。是否可以从 Context 类中提取平台和设备?

转载 作者:行者123 更新时间:2023-11-28 04:28:04 27 4
gpt4 key购买 nike

我正在学习 OpenCL,我已经知道这个问题可以通过首先以正确的方式设置平台和设备来解决。

我想知道的是。在免费在线类(class)中 https://handsonopencl.github.io/他们开始以我喜欢的更简洁的方式设置环境。

我现在在练习 9,应该从头开始编写内核和主机程序。我想以这种跳过设置平台和设备的快捷方式来解决它,而是直接调用 Context 类。像这样。

    #define DEVICE CL_DEVICE_TYPE_GPU
try {
// Create a context
cl::Context context(DEVICE);

// Load source and build
cl::Program program(context, kernelSource, true);

// Get command queue
cl::CommandQueue queue(context);

// Create kernel functor
auto pi = cl::make_kernel<int>(program, "pi");


}
catch (cl::Error err) {
std::cout << "Exception" << std::endl;
std::cerr << "ERROR: " << err.what() << "(" << err_code(err.err()) << ")" << std::endl;

}

现在。我已正确设置所有内容。 C++ 代码可以编译,如果我提供了正确的 kernelSource,程序也可以编译。

到目前为止一切顺利。

当我在我的内核源代码中犯了一个错误并且想要获取 CL_PROGRAM_BUILD_LOG 时,问题就来了。我发现的唯一调用要求我传递一个 cl::device(它显然应该存在于 Context 构造函数中的某个位置)。但是由于我采用了速记方式,因此在构造函数之外我手头没有这个。

我知道我可以执行我跳过的调用并获得我需要的值。但我觉得这会剥夺以速记方式编写本文的好处。

有没有办法从 Context 类中获取设备和平台标识符?我的 C++ 不是最强大的,但是通过查看类(class)我找不到方法。

在我错过的这个包装器或调用中是否有任何其他方法可以在不先设置设备和平台的情况下为我检索构建日志?

我不应该以这种方式设置我的代码有什么真正充分的理由吗?

我可以看到扫描平台和设备的唯一好处是我是否有兴趣获得功能并做出明智的选择。在这种情况下,我不是,因为我已经知道我想使用哪个设备。

编辑:添加此代码片段以展示我如何使用答案中提供的 context.getInfo() 解决我的问题。

    cl::Context context;
cl::Program program;
cl::CommandQueue queue;

try {
// Create a context
context = cl::Context(DEVICE);

// Load source and build
//program = cl::Program(context, kernelSource, true); // Don't do this. It will error with "abort() has been called
program = cl::Program(context, kernelSource);
program.build();

// Bind variables
d_sum = cl::Buffer(context, CL_MEM_WRITE_ONLY, sizeof(float) * 1);

// Get command queue
queue = cl::CommandQueue(context);

// Create kernel functor
auto clpi = cl::make_kernel<int, cl::Buffer, cl::LocalSpaceArg>(program, "pi");

// Run kernel
clpi(cl::EnqueueArgs(queue, cl::NDRange(num_steps), cl::NDRange(workgroup_size)), num_steps, d_sum, d_local_sums);

// Extract sum
cl::copy(queue, d_sum, h_sum.begin(), h_sum.end());

}
catch (cl::Error err) {
std::cout << "Exception" << std::endl;
std::cerr << "ERROR: " << err.what() << "(" << err_code(err.err()) << ")" << std::endl;

if (err.err() == CL_BUILD_PROGRAM_FAILURE)
{
for (cl::Device dev : context.getInfo<CL_CONTEXT_DEVICES>())
{
// Check the build status
cl_build_status status = program.getBuildInfo<CL_PROGRAM_BUILD_STATUS>(dev);
if (status != CL_BUILD_ERROR)
continue;
// Get the build log
std::string name = dev.getInfo<CL_DEVICE_NAME>();
std::string buildlog = program.getBuildInfo<CL_PROGRAM_BUILD_LOG>(dev);
std::cerr << "Build log for " << name << ":" << std::endl
<< buildlog << std::endl;
}
}
}

最佳答案

您可以使用 clGetContextInfo(CL_CONTEXT_DEVICES) 查找与上下文关联的设备列表函数(或 C++ 的 Context::getInfo())。然后您可以遍历这些设备并询问每个设备的程序构建状态或构建日志。

可以使用相同的函数从上下文中获取平台:for CL_CONTEXT_PROPERTIES查询将返回一个属性数组,其中应包含 CL_CONTEXT_PLATFORM 的值.

关于c++ - OpenCL C++ 包装器。是否可以从 Context 类中提取平台和设备?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53751484/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com