我是OpenCL编程的新手。 我的第一个计划让我很难过。我想查询每个平台中每个设备的设备名称和供应商名称。我的系统有两个平台,第一个是AMD平台,第二个是NVIDIA CUDA平台。我已经编写了以下代码来获取所需的信息。
int main(int argc, char **argv) {
try {
vector<cl::Platform>platforms;
cl::Platform::get(&platforms);
cl_context_properties properties[] = {CL_CONTEXT_PLATFORM, (cl_context_properties)(platforms[0])(), 0};
cl::Context context(CL_DEVICE_TYPE_ALL, properties);
vector<cl::Device> devices = context.getInfo<CL_CONTEXT_DEVICES>();
string dName(devices[0].getInfo<CL_DEVICE_NAME>());
string vendor(devices[0].getInfo<CL_DEVICE_VENDOR>());
cout<<"\tDevice Name:"<<dName<<endl;
cout<<"\tDevice Vendor: "<<vendor<<endl;
}catch(cl::Error err) {
cerr<<err.what()<<" error: "<<printErrorString(err.err())<<endl;
return 0;
}
}
当我在
中将平台索引更改为1时 cl_context_properties properties[] = {CL_CONTEXT_PLATFORM, (cl_context_properties)(platforms[0])(), 0};
我的程序因“分段错误”而崩溃。
我非常感谢你的帮助。 谢谢!
答案 0 :(得分:1)
我怀疑您使用的是AMD APP SDK中的cl.hpp头文件?如果是这种情况,则问题是头文件调用OpenCL 1.2函数(不记得哪一个)由系统中的AMD设备提供,而不是由Nvidia GPU提供。您的Nvidia GPU仅支持OpenCL 1.1。我知道的最佳解决方案是使用Khronos网站上的OpenCL 1.1头文件。