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

时间:2016-01-13 14:55:43

标签: opencl

我正在尝试在我的Windows 7-64位操作系统上设置OpenCL环境,以便能够在我的ATI Radeon HD 5450上进行GPU编程以实现并行计算。我有Visual Studio 2015,我下载了支持OpenCL 2.0的AMD APP 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;
}

程序编译正确,代码应该没问题。它来自http://simpleopencl.blogspot.de/2013/06/tutorial-simple-start-with-opencl-and-c.html。但是当我执行代码时,它停在第二行,似乎它无法获得任何平台。有人知道原因吗?谢谢!

1 个答案:

答案 0 :(得分:0)

如果您使用的是带有intel的PC,那么您的intel PC CPU将充当主机设备。我强烈建议您安装英特尔OpenCL驱动程序(如果您使用的是英特尔)。这个问题可能是因为您安装了错误的驱动程序或由于缺少intel OpenCL驱动程序。

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

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