gpt4 book ai didi

c++ - OpenCl 不能使用 clGetPlatformIDs

转载 作者:行者123 更新时间:2023-11-30 05:24:50 25 4
gpt4 key购买 nike

我一直在努力学习 OpenCl,但每次我输入这个命令时,我的代码都会出错,这是一个简单的代码,我已经隔离了错误:clGetPlatformIDs 引起以下错误:

OpenCl-OpenGl.exe 中 0x778d15ee 处未处理的异常:0xC0000005:访问冲突。

然后程序给出“中断”或“继续”的选项

#pragma comment(lib, "OpenCL.lib")
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <CL/cl.h>

int main() {
cl_platform_id platform;
cl_int err;
err = clGetPlatformIDs(1, &platform, NULL);

return 0;

}

最佳答案

可能有以下原因:

  1. 您的系统上有多个 OpenCL.dll,并且通过选择(或某些 VS 设置、环境路径)可执行文件正在加载旧版本。检查 VS 模块窗口(调试 > 窗口 > 模块)是否加载了正确的 OpenCL.dll(C:\Windows\SysWow64 或 C:\Windows\System32)。

  2. 虽然 clGetPatformIDs 中的第 3 个参数是可选的,但我知道一些较旧的英特尔 OpenCL 供应商库(intelopencl32.dll 或 intelopencl64.dll)不会检查此参数,并且可能会尝试写入该 nullptr。我建议尝试添加第三个参数来接收平台计数。

  3. 如果两者似乎都不能解决问题,请在发生崩溃的时间/地点从 Visual Studio 发布堆栈转储。此外,检查调试输出窗口以查看它是否是读取或写入访问冲突。所有窗口都可以在菜单 Debug > Windows > Output 下找到。您还可以在那里找到堆栈和模块。


编辑:我刚刚使用最新的 OpenCL.dll 版本进行了测试,并且只提供了一个包含 1 个条目的数组,就像您所做的那样。尽管如此,OpenCL.dll 写入了 3 个元素,这意味着它写入了允许的数组边界之外。巧合的是,我有 3 个平台。

当您提供类型为 cl_platform_id 的单个变量时,此行为会损坏堆栈,并且在这个简短的程序中很可能会损坏 clGetPlatformIds 的返回地址,从而导致崩溃。我必须进一步调查。同时尝试使用 cl_platform_id platforms[8] 数组。它看起来像是我的 OpenCl.dll 版本 2.01 中的错误

试试这段代码:

cl_uint PlatformCount = 0;
cl_platform_id Platforms[8] = { 0 };

cl_int Status = clGetPlatformIDs(sizeof(Platforms) / sizeof(Platforms[0]), Platforms, &PlatformCount);
if (Status != CL_SUCCESS || PlatformCount == 0)
error(...)

关于c++ - OpenCl 不能使用 clGetPlatformIDs,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38543537/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com