【问题标题】:segmentation fault at clBuildProgramclBuildProgram 的分段错误
【发布时间】:2012-08-21 06:26:14
【问题描述】:

当我运行我的 opencl 程序时,我在 clBuildProgram 中遇到了“分段错误”的消息。编译这个程序时没有错误信息,但是当我运行它时可以看到“segmentation fault”。我将 Opencl API 总结如下。我的代码有错误吗?

clGetPlatformIDs(1, &platform, &num_platforms);
status = clGetDeviceIDs(platform, CL_DEVICE_TYPE_GPU, 1, &device, &num_devices);
cl_context context = clCreateContext(NULL, 1, &device, NULL, NULL, NULL);
queue = clCreateCommandQueue( context, device, 0, NULL);
cl_program program = clCreateProgramWithSource( context,1,&str,NULL, NULL);
cl_int result = clBuildProgram(program, 1, &device, NULL, NULL, NULL);

我也尝试如下运行,但可以看到同样的问题。

cl_int result = clBuildProgram(program, 0, NULL, NULL, NULL, NULL);

顺便说一句,我使用的是 Linux Ubuntu 10.04 64bit 和 NVIDIA GeForce GT 330 for GPGPU 的环境。

*编辑添加问题:clBuildProgram 中第三个参数的定义是“设备列表”,所以我认为“&device”是正确的。这样对吗?如果我错了,“设备列表”的确切含义是什么?

【问题讨论】:

  • 您是否尝试过在调试器中运行,并查看使用的变量是否正常?
  • 还没有,因为对我来说这是第一次进行OpenCL编程,所以我正在寻找可以使用的调试器。你知道有什么好的调试器可以解决这个问题吗?
  • 我猜你的内核代码中有一个错误。可以发在这里吗?
  • 实际上,我尝试运行的这个 opencl 代码来自我的 opencl 编程研究的网页。您可以在这里找到内核代码(倒数第二个的代码框):gamedev.net/blog/1241/…
  • 您可以使用 VS 调试器 (F5) 进行主机代码调试,对于内核和 API 调试,有许多程序,例如 AMD 的 OpenCL/GL 调试器:developer.amd.com/tools/gDEBugger/Pages/default.aspx

标签: c++ segmentation-fault opencl


【解决方案1】:

您是否尝试过使用 valgrind (http://valgrind.org/docs/manual/quick-start.html) 运行程序?如果您还将包含调试信息(在 g++ 或 gcc 中使用 -g 标志),它将向您显示产生分段错误的实际代码行。 在 valgrind 下运行程序非常简单: valgrind myprog [arg1] [arg2]

【讨论】:

  • 在您的指导下我正在尝试这个 valgrind。我认为这对于调试一种内存问题非常有用。但就我而言,执行此方法会产生很多消息。我认为这是因为内核代码有点复杂。
  • 您可以尝试在 gdb 下运行您的程序,这将产生明显更少的输出,主要是您的程序消息,并且一旦产生分段错误就会中断。如果您编译包含调试信息,它将显示发生故障的行。
  • 要在gdb下运行,可以试试:gdb ./your_exe,这会提示你输入运行命令。如果您的程序需要参数,您将在运行前使用“set args”命令设置它们。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2018-11-29
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-11-18
相关资源
最近更新 更多