C++ OpenCL C++;绑定:EnqueuenRangeKernel忽略偏移量和全局参数

C++ OpenCL C++;绑定:EnqueuenRangeKernel忽略偏移量和全局参数,c++,opencl,C++,Opencl,您好,我有一个非常简单的示例程序,我找不到错误 调用enqueueNDRangeKernel时,全局参数和偏移量参数被完全忽略。 get_global_id(0)总是将0赋予局部参数-1(在本例中为49)。 就我对Api的理解而言,我认为我应该得到30到79? 问题在哪里 #define __CL_ENABLE_EXCEPTIONS #include <CL/cl.hpp> #include <iostream> #include <string> con

您好,我有一个非常简单的示例程序,我找不到错误

调用enqueueNDRangeKernel时,全局参数和偏移量参数被完全忽略。 get_global_id(0)总是将0赋予局部参数-1(在本例中为49)。 就我对Api的理解而言,我认为我应该得到30到79? 问题在哪里

#define __CL_ENABLE_EXCEPTIONS
#include <CL/cl.hpp>

#include <iostream>
#include <string>

const std::string kernelSource =
   "__kernel void square ( __global float* A, const __global float* B, int N)\n"
   "{\n"
   "   int i = get_global_id(0);\n"
   "   if (i<100) A[i] = i;\n"
   "}\n";

int main(int argc, char *argv[])
{
   try {
      std::vector<cl::Platform> platforms;
      cl_int N = 100;
      std::vector<cl::Device> devices;
      cl::Platform::get(&platforms);   
      platforms.begin()->getDevices(CL_DEVICE_TYPE_ALL, & devices);
      cl::Context context(devices);
      cl::Device& device = devices.front();
      cl::CommandQueue cmdqueue(context, device);
      cl::Buffer inputBuffer(context, CL_MEM_READ_WRITE, 200 *  sizeof(cl_float));
      cl::Buffer outputBuffer(context, CL_MEM_READ_WRITE, 200 *  sizeof(cl_float));
      cl_float inputs[200],outputs[200];
      for (int i=0;i<100;i++){
         inputs[i] = i;
         outputs[i] = 0;
      }
      cmdqueue.enqueueWriteBuffer(inputBuffer, true, 0, 200*sizeof(cl_float),inputs);
      cmdqueue.finish();
      cl::Program::Sources sourceCode;
      sourceCode.push_back(std::make_pair(kernelSource.c_str(),kernelSource.size()));
      cl::Program program = cl::Program(context, sourceCode);
      program.build(devices);
      cl::Kernel kernel(program, "square");
      kernel.setArg(0, outputBuffer);
      kernel.setArg(1, inputBuffer);
      kernel.setArg(2,N);
      cl::Event event;
      cmdqueue.enqueueNDRangeKernel(kernel,cl::NDRange(30),cl::NDRange(50), cl::NDRange(25),NULL,&event);
      event.wait();
      cmdqueue.enqueueReadBuffer(outputBuffer, true, 0, 200*sizeof(cl_float),outputs);
      cmdqueue.finish();
      for (int i=0;i<100;i++){
         std::cout << outputs[i] << std::endl;
      }
   }
   catch (cl::Error& err) {
      std::cerr << "OpenCL error: " << err.what() << "(" << err.err() << ")" << std::endl;
      return 1;
   }
}
\define\u CL\u ENABLE\u异常
#包括
#包括
#包括
常量std::字符串内核源=
内核空平方(uuu全局浮点*A,常量uu全局浮点*B,整数N)\N
“{\n”
“int i=get_global_id(0);\n”

“如果(我记得有些平台不支持偏移量。但你没有做错任何事。也许是问题。我使用的是MESA OpenCL。也许我应该安装原始的AMD驱动程序。目前clinfo提供:平台版本OpenCL 1.1 MESA 10.3.3使用AMD fglrx,它工作正常!谢谢!正在寻找使用OpenCL的示例,并获得了此信息代码至少可运行:)谢谢。