AnsweredAssumed Answered

Problems on Turks GPU

Question asked by turks_user on Dec 17, 2013
Latest reply on Dec 18, 2013 by nou

Hi, I'm having a problem running some simple code on my amd gpu. It runs fine on my intel i5.

The problem seems to be just before I create the kernel, after the buffers have been created successfully.

 

I get the runtime error: Unhandled exception at 0x0f935187 in 3D Camera.exe: 0xC0000005: Access violation reading location 0x00000000.

 

Can anyone help? Seems there are certain rules I should follow on amd gpu's that don't apply to CPUs.

 

Also, I'm using C++. My code is shown below


using namespace cv;
using namespace std;


int main() {


  const std::string hw("Hello World\n");
  cl_int err;
  //get all platforms (drivers)

  //CHOOSING PLATFORM ON COMPUTER
    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);
    }
    
  int platform;
  cout<<"Available Platforms: "<<endl;
  for (int i=0;i<all_platforms.size();i++) {
  cout<<i<<". "<<all_platforms[i].getInfo<CL_PLATFORM_NAME>()<<"\n";
  } 
  cout<<endl<<"Choose a Platform number: ";
  cin>>platform;
  cl::Platform default_platform=all_platforms[platform]; //Choosing a platform
  cout<<endl<<"Using: "<<default_platform.getInfo<CL_PLATFORM_NAME>()<<endl;

  //CHOOSING DEVICE ON 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);
    }
  cout<<endl<<"Available devices on chosen Platform: "<<endl;
  for (int i=0;i<all_devices.size();i++) {
  cout<<i<<". "<<all_devices[i].getInfo<CL_DEVICE_NAME>()<<"\n";
  }
  int device;
  cout<<endl<<"Choose a device number: ";
  cin>>device;
    cl::Device default_device=all_devices[device];
    std::cout<< "Using device: "<<default_device.getInfo<CL_DEVICE_NAME>()<<"\n";

  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)];}           ";


  cl::Context context(default_device);
  cl::Program::Sources sources(1,std::make_pair(kernel_code.c_str(), kernel_code.length())); // +1


  cl::Program program(context,sources);
  err = program.build(all_devices);
  cout<<"Program built. "<<endl;


  // 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);
  cout<<"Buffers enqueued. "<<endl;

    //alternative way to run the kernel
    cl::Kernel kernel_add = cl::Kernel(program,"simple_add");
  cout<<"Kernel created. "<<endl;
    kernel_add.setArg(0,buffer_A);
    kernel_add.setArg(1,buffer_B);
    kernel_add.setArg(2,buffer_C);
  cout<<"Args set. "<<endl;
    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: "<<endl;


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

    return 0;
}

Outcomes