【问题标题】:Cannot get my first OpenCL program to work无法让我的第一个 OpenCL 程序运行
【发布时间】:2016-04-18 14:41:55
【问题描述】:

我正在尝试在我的 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 。但是当我执行代码时,它停在第二行,似乎无法获得任何平台。有人知道原因吗?谢谢!

【问题讨论】:

  • 你有SDK,但你有安装驱动吗?
  • 你是说AMD APP SDK?我认为是的,它已正确安装...我一直按照安装说明进行操作
  • 我指的是驱动程序,而不是 SDK。否则,您将编译的二进制文件在您的系统中找不到任何有用的硬件。
  • 我还以为AMD APP SDK其实就是驱动。。。你说的驱动还有什么意思?英特尔处理器?
  • 如果您有 GPU,则驱动程序是 GPU 供应商提供给您的。不是 .h 文件或 .cpp 文件或您需要链接的东西,不,它不是 SDK。 Windows 有一个默认驱动程序,它只允许您使用 GPU,而无需任何额外功能(OpenCL、HW 编码等)。当您安装驱动程序时,您允许将功能公开给应用程序。

标签: opencl


【解决方案1】:

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

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

另外,我建议对 ubuntu 进行双重引导,以 Linux CLI 方式使用 OpenCL 会更容易。

【讨论】:

  • 嗯,这似乎很合乎逻辑......确实,我正在研究英特尔内核。我在此链接 software.intel.com/en-us/articles/opencl-drivers> 下下载了 Intel OpenCl 驱动程序。现在,我们是否需要再进行一次链接,在 Visual Studio 上指示库等?另外,很奇怪,但是路径环境变量中没有添加bin路径……这正常吗?
  • 我猜您需要手动将 bin 添加到路径中,是的,您必须在 Visual Studio 中再次链接该库。但请检查您安装的驱动程序是否与您的处理器型号完全匹配。
  • 尝试安装英特尔 SDK for opencl,它包含所有驱动程序。当我不得不在基于 Intel 的 cpu 上运行我的代码时,我就是这样做的
猜你喜欢
  • 2014-06-13
  • 1970-01-01
  • 2020-08-19
  • 1970-01-01
  • 2015-07-24
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多