无法使我的第一个OpenCL程序工作

无法使我的第一个OpenCL程序工作,opencl,Opencl,我正试图在我的Windows 7-64位操作系统上设置OpenCL环境,以便能够在我的ATI Radeon HD 5450上运行GPU程序,以实现并行计算。我有Visual Studio 2015,我下载了支持OpenCL 2.0的AMD应用程序SDK v3.0。。。现在我尝试执行一个简单的矢量加法程序: #define CL_USE_DEPRECATED_OPENCL_2_0_APIS #include <CL/cl.hpp> #include <iostream>

我正试图在我的Windows 7-64位操作系统上设置OpenCL环境,以便能够在我的ATI Radeon HD 5450上运行GPU程序,以实现并行计算。我有Visual Studio 2015,我下载了支持OpenCL 2.0的AMD应用程序SDK v3.0。。。现在我尝试执行一个简单的矢量加法程序:

#define CL_USE_DEPRECATED_OPENCL_2_0_APIS
#include <CL/cl.hpp>
#include <iostream>

using namespace std; 

int main() {
    //get all platforms (drivers)
    std::vector<cl::Platform> all_platforms;
    cl::Platform::get(&all_platforms);
    if (all_platforms.size() == 0) {
        std::cout << " No platforms found. Check OpenCL installation!\n";
        exit(1);
    }
    cl::Platform default_platform = all_platforms[0];
    std::cout << "Using platform: " <<default_platform.getInfo<CL_PLATFORM_NAME>() << "\n";

     //get default device of the default platform
    std::vector<cl::Device> all_devices;
    default_platform.getDevices(CL_DEVICE_TYPE_ALL, &all_devices);
    if (all_devices.size() == 0) {
        std::cout << " No devices found. Check OpenCL installation!\n";
        exit(1);
    }
    cl::Device default_device = all_devices[0];
    std::cout << "Using device: " << default_device.getInfo<CL_DEVICE_NAME>() << "\n";


    cl::Context context({ default_device });

    cl::Program::Sources sources;

// kernel calculates for each element C=A+B
std::string kernel_code =
    "   void kernel simple_add(global const int* A, global const int* B, global int* C){       "
    "       C[get_global_id(0)]=A[get_global_id(0)]+B[get_global_id(0)];                 "
    "   }                                                                               ";
sources.push_back({ kernel_code.c_str(),kernel_code.length() });

cl::Program program(context, sources);
if (program.build({ default_device }) != CL_SUCCESS) {
    std::cout << " Error building: " << program.getBuildInfo<CL_PROGRAM_BUILD_LOG>(default_device) << "\n";
    exit(1);
}


// create buffers on the device
cl::Buffer buffer_A(context, CL_MEM_READ_WRITE, sizeof(int) * 10);
cl::Buffer buffer_B(context, CL_MEM_READ_WRITE, sizeof(int) * 10);
cl::Buffer buffer_C(context, CL_MEM_READ_WRITE, sizeof(int) * 10);

int A[] = { 0, 1, 2, 3, 4, 5, 6, 7, 8, 9 };
int B[] = { 0, 1, 2, 0, 1, 2, 0, 1, 2, 0 };

//create queue to which we will push commands for the device.
cl::CommandQueue queue(context, default_device);

//write arrays A and B to the device
queue.enqueueWriteBuffer(buffer_A, CL_TRUE, 0, sizeof(int) * 10, A);
queue.enqueueWriteBuffer(buffer_B, CL_TRUE, 0, sizeof(int) * 10, B);


//run the kernel
//cl::KernelFunctor simple_add(cl::Kernel(program, "simple_add"), queue, cl::NullRange, cl::NDRange(10), cl::NullRange);
//simple_add(buffer_A, buffer_B, buffer_C);

//alternative way to run the kernel
cl::Kernel kernel_add=cl::Kernel(program,"simple_add");
kernel_add.setArg(0,buffer_A);
kernel_add.setArg(1,buffer_B);
kernel_add.setArg(2,buffer_C);
queue.enqueueNDRangeKernel(kernel_add,cl::NullRange,cl::NDRange(10),cl::NullRange);
queue.finish();

int C[10];
//read result C from the device to array C
queue.enqueueReadBuffer(buffer_C, CL_TRUE, 0, sizeof(int) * 10, C);

std::cout << " result: \n";
for (int i = 0; i<10; i++) {
    std::cout << C[i] << " ";
}

return 0;
}
\define CL\u USE\u DEPRECATED\u OPENCL\u 2\u 0\u API
#包括
#包括
使用名称空间std;
int main(){
//获取所有平台(驱动程序)
std::矢量所有_平台;
cl::平台::获取(&所有_平台);
如果(所有平台.size()==0){

std::cout如果您使用的是带有intel的PC,则您的intel PC CPU将充当主机设备。我强烈建议您也安装intel OpenCL驱动程序(如果您使用intel)。此问题可能是因为您安装了错误的and驱动程序,也可能是因为缺少intel OpenCL驱动程序

如果您的CPU也是AMD CPU,请检查正确的驱动程序版本,驱动程序不匹配也可能导致类似的问题


另外,我建议对ubuntu进行双启动,以Linux CLI方式使用OpenCL要容易得多。

你有SDK,但你有安装驱动程序吗?你是说AMD应用程序SDK吗?我想是的,它安装正确了…我按照安装说明一直到最后我是指驱动程序,而不是SDK。否则你将无法继续堆一个二进制文件,在你的系统中找不到任何有用的硬件。我认为AMD应用程序SDK实际上就是驱动程序…你对驱动程序的其他含义是什么?对于英特尔处理器?如果你有GPU,驱动程序就是GPU供应商提供给你的。不是.h文件或.cpp文件,也不是你需要链接的东西,也不是SDK。Windows有一个默认的驱动程序,只允许您使用GPU而不需要任何额外的功能(OpenCL、硬件编码等)。当你安装dirver时,你允许将这些功能公开给应用程序。这看起来很合理……事实上,我正在开发一个Intel core。我在这个链接下下载了Intel OpenCl驱动程序。现在,我们需要再次链接吗,指明visual studio上的库等等?同样,这很奇怪,但是没有s没有将bin path添加到path环境变量中…这正常吗?我想您需要手动将bin添加到path中,是的,您必须在visual studio中再次链接库。但请检查您安装的驱动程序是否与处理器型号完全匹配。请尝试安装英特尔opencl SDK,它包含所有驱动程序s、 当我不得不在基于Intel的cpu上运行代码时,我就是这么做的