我在nvidia quattro 6000设备上运行了长期运行的内核.内核涉及一个具有数万迭代的循环. 当我运行内核时,屏幕变成黑色,Windows重新启动了GPU驱动程序,而Clfinish则返回了一个错误.因此,我为自己拿了第二张GPU卡即可显示,现在不适用2秒的超时. 计算出50秒的内核,然后存在这些错误(以" GPU错误"前缀是由ClcreateContext错误打印的错误回调): GPU ERROR: CL_OUT_OF_RESOURCES error executing clFinish on Quadro 6000 (Device 0). Computation finished, took 50 seconds (00:00:50) GPU ERROR: CL_OUT_OF_RESOURCES error waiting for idle on Quadro 6000 (Device 0). clFinish() returned CL_OUT_OF
以下是关于 opencl 的编程技术问答
有几个字符串,例如 std ::字符串首先,第二,第三; ... 我的计划是将其地址收集到一个char*数组中: char *addresses = {&first[0], &second[0], &third[0]} ... 并将char **地址传递给OpenCL内核. 有几个问题: 主要问题是我无法传递一系列指针. 有什么好方法可以使用内核代码中的多种字符串而不复制它们,但将它们留在共享内存中? 我在Windows上使用NVIDIA.因此,我只能使用opencl 1.2版本. 我不能加入字符串,因为这些字符串来自不同的结构... 编辑: 根据第一个答案,如果我有这个(示例): char *p; cl_mem cmHostString = clCreateBuffer(myDev.getcxGPUContext(), CL_MEM_ALLOC_HOST_PTR, BUFFER_SIZE, NULL, &oclEr
我遇到了一个奇怪的问题,其中一些opencl代码我在蓝色月球中的每一次, Windows TDR 将启动并重置GPU.令人讨厌的内核仅运行150毫秒,在TDR杀死它之前将经营数千次(在整个小时内),因此我敢肯定,内核本身不应怪. 我担心的是,一旦TDR启动,内核死亡,该程序就处于永恒的困境状态.从我可以告诉clFinish的电话. 是否有一种方法可以检测内核是否已经死亡,以便可以优雅地处理? 解决方案 我设法提出了一个解决方案,尽管它远非最佳. 我已经修改了程序,以便在单独的线程中完成OpenCL处理.我在父母和子过程之间创建了一个全局共享的看门狗变量.当父寄生作为线程的处理函数时,它将变量设置为当前时间以毫秒为单位.当处理线程完成时,它将看门狗变量重置为零. 当父螺纹等待处理线程完成时,它会密切关注看门狗计时器.如果计时器超过一定的阈值,则该程序在不等待子过程返回的情况下强行终止自己. 此解决方案在有或没有Windows TDR设置的情况下使用.如
在搜索了很多解决此问题的解决方案后,我发现该特定错误尚未适当记录在Windows上.因此,我决定将此问题与解决方案一起发布.抱歉,如果我将其发布在错误的部分中.我希望该解决方案将来可以帮助用户解决Pyopencl安装错误.请注意,此处使用的示例是支持AMD OpenCL SDK sdk的ATI Radeon GPUs.对于其他GPUs,请参考其各自的参数,并根据需要实施它们.如果安装失败,也不要尝试使用pip安装.而是从在这里. 因此,安装Pyopencl时的错误消息是: 在src/wrapper/wrap_cl.cpp中包含的文件中:1:0: src/wrapper/wrap_cl.hpp:27:19:致命错误:cl/cl.h:没有这样的文件或目录 错误:命令" GCC"失败,出口状态1 为了解决这个问题,必须知道默认的Cl/cl.h通常存储在:C:/Program Files (x86)/.../include/CL中.但是由于(x86)无法通过gcc编译器来识别,
以下 this 和main.c代码. 运行cmake命令find_package(OpenCL REQUIRED)我得到了: -- Looking for CL_VERSION_2_2 - found -- Found OpenCL: C:/Program Files (x86)/IntelSWTools/system_studio_2020/OpenCL/sdk/lib/x86/OpenCL.lib (found version "2.2") 指示发现了OpenCL SDK 2.2版.这与我从clinfo工具中获得的内容相矛盾,该工具检测到Intel的SDK/平台的1.2 OpenCL.现在运行可执行文件时,我会得到: cl_version.h:cl_target_opencl_version尚未定义.默认为220(opencl 2.2) 我的问题是: 为什么我从cmake和clinfo? 中获得两个不同版本的OpenCL 我在运行时得到什么警告以及
是否可以使用mingw和nvidia sdk进行编译? 我知道它没有正式支持,但这没有道理.图书馆不是作为静态链接的库提供的吗?我的意思是,一旦与任何可能的编译器进行了编译,并成功地链接了,应该是什么问题? 我设法编译并成功地将我的代码链接到了Nvidia的SDK提供的OpenCL库,但是可执行的可执行抛出分段故障clGetPlatformIDs是我的代码中的第一个OpenCL调用. 这是我的汇编命令 x86_64-w64-mingw32-g++ -std=c++11 File.cpp \ -L"C:\Program Files\NVIDIA GPU Computing Toolkit\CUDA\v5.0\lib\x64" \ -I"C:\Program Files\NVIDIA GPU Computing Toolkit\CUDA\v5.0\include" \ -gcoff -lOpenCL -lkernel32 -luser32 -lgdi32 -lwins
以下这篇文章,我在其中使用了这些说明安装Nvidia的OpenCL SDK. clinfo工具正确检测1.2 OpenCL版本.但是,以下CMakeLists.txt文件: cmake_minimum_required(VERSION 3.1) project(OpenCL_Example) find_package(OpenCL REQUIRED) include_directories(${OpenCL_INCLUDE_DIRS}) link_directories(${OpenCL_LIBRARY}) add_executable(main main.c) target_include_directories(main PUBLIC ${CMAKE_CURRENT_SOURCE_DIR}) target_link_libraries(main ${OpenCL_LIBRARY}) 从 -- Looking for CL_VERSION_1_1 - found --
我在OpenCL中发现了主机 - 客户端浮点标准的问题.问题在于,OpenCL计算出的浮点与我的Visual Studio 2010编译器相同的浮点限制,在X86中编译时. 但是,在X64中编译时,它们处于相同的限制.我知道这一定是有点 http://wwwww.viva64.com/en/en/B/0074/ 我在测试中使用的来源是: http:/http://www.codeproject.com/articles/110685/part-1-opencl-portable-parlallelism 当我在x86中运行该程序时,当内核和C ++程序的平方为1269760数字时,它将给我202个数字.但是,在64位构建中,1269760个数字是正确的,换句话说,100%. 此外,我发现OpenCl和X86 C ++的计算结果之间的误差为5.5385384E-014,与数字的epsilon相比,这是很小的,但不够小,但不够小,即2.9222122122122122125433782
我只是试图使自己熟悉OpenCl,但是当互联网中的每个人都在谈论下载供应商特定的OpenCl SDK时,完全感到困惑.我为什么需要那个? 我对使用OpenCL的理解是以下内容: 下载kronos在 khronos opencl registry 中下载opencl标头文件. 编译您的代码并针对Opencl.dll链接. 它使我感到困惑的原因是因为我认为OpenCL应该抽象供应商的特定实现.如果我现在下载了特定于供应商的SDK,那么这个优势就会破坏? 有人可以清楚这个吗? 解决方案 您的理解是绝对正确的 - 您不需要任何供应商SDK来开发或运行OpenCL程序.您只需要链接的标题和库.供应商SDK提供示例代码,在您学习如何使用OpenCL时可能很有用,并且它们还可以提供可以帮助开发的工具. 在Windows上,您将需要一个OpenCL.lib库来链接,而SDK确实提供了.您可以下载该库的来源为此库,如果您愿意,请自己构建. 但是,使用特定供应商
我刚刚开始在OpenCL工作,目前我正在研究OpenCL中应该是相对基本的Hello_world程序.不幸的是,该程序没有输出适当的短语或根本没有输出而无需输出. 对为什么是这种情况有什么想法? 下面是:openglsource.cpp和hello.cl #define CL_USE_DEPRECATED_OPENCL_2_0_APIS #include #include #include int main() { std::vector platforms; cl::Platform::get(&platforms); auto platform = platforms.front(); std::vector devices; platform.getDevices(CL_DEVICE_TYPE_CPU,
我有一个搜索opencl 1.1算法,该算法与少量数据合作: 1.)构建 inputdata 数组并将其传递给GPU 2.)创建一个非常大的 resultdata 容器(例如200000 * sizeof(cl_uint)),并通过此操作. 3.)创建 Resultizize 容器(Inited to Zero),可以通过原子操作访问(至少我想这是) 当我的一名工人有结果时,它将复制到 resultdata 缓冲区中,并在Atomic Inc操作中递增 Resuctizize (直到缓冲区已满). 让我编写一个代码示例(OpenCL代码): lastPosition = atomic_add(resultBufferSize, 5); while (lastPosition > RESULT_BUFFER_SIZE) { lastPosition = atomic_add(resultBufferSize, 5); } ,在主机侧我读了缓冲区并
我目前正在使用Intel的OpenCL SDK平台进行异质并行编程(OPENCL).我正在使用Visual Studio 2010 Ultimate.我的系统中没有任何GPU.我曾在CUDA SDK平台上工作以进行OpenCL编程.这是我第一次使用Intel的OpenCL SDK进行OpenCL编程. 我尝试了一些基本平台,设备,上下文识别/创建/定义"行动中的OpenCL"书籍.他们都工作正常.因此,我们可以考虑正确配置Visual Studio. 现在,我正在尝试在Visual Studio中构建一个" Hello World"程序,这给了我以下错误: 错误msb3721:命令"" c:\ program文件(x86)\ intel \ opencl sdk \ 3.0 \ bin \ x86 \ x86 \ ioc32.exe" -cmd = build build -input -input =" Google \ Programs \ 1 Code \ feb
我想在Visual Studio 2017中的NVIDIA OPENCL中编写应用程序,但不知道如何为此目的创建项目. 我有来自NVIDIA(GeForce 940m)和Intel(HD Graphics 5500)的GPU,并且已经设法打开并为OpenCl开放并运行了Intel示例程序,但它们有将近一千条代码,因此我决定尝试Nvidia Opencl,但Don don don don知道如何.在某些论坛上,他们说我应该下载Cuda Toolkit并安装OpenCL,其他人则说我应该下载支持OpenCL的驱动程序,但我不知道哪个驱动程序是正确的.我已经从 https://www.nvidia.pl/download安装了CUDA和驱动程序/index.aspx?lang=pl 但我仍然不可能在Visual Studio中创建NVIDIA项目. 解决方案 OpenCL运行时已经包含在NVIDIA图形驱动程序中.您只需要opencl c ++标头文件,OpenCL.lib文件和
我想为 vim-opencl插件编写opencl语法检查器. OpenCL编译器对输出错误进行一些奇怪的格式.有两种类型的错误. 正常(带有小错误说明): "/tmp/OCLUKvOsF.cl", line 143: error: expression must have integral type rec_table[PRIME_P - ri] = PRIME_P - i; ^ 和非正常的错误解释中的线路断开: "/tmp/OCLUKvOsF.cl", line 148: error: a value of type "uint16" cannot be used to initialize an entity of type "uint" uint a = value, b = PRIME_P, u = 0, v = 0; ^ 因此,麻烦是在第二种情况下
我有一个框架,希望使用 opencv 使用 opencl type oclmat .但是下面的代码给我黑色框架结果: capture.read(fMat); // frame from camera or video oclMat f; f.upload(fMat); oclMat bf(f.rows*2, f.cols*2, f.ocltype()); // "bf"-big frame oclMat bfRoi = bf(Rect(0, 0, f.cols, f.rows)); f.copyTo(bfRoi); // something wrong here // label 1 bf.download(fMat); Mat bf2; bf.convertTo(bf2, fMat.type()); // this convert affects to nothing imshow("big frame", bf2); 所以我必须在" label 1"位置" oclmat->
我将要编写一个堆叠软件.因此,我想将一个或多个视频的框架提取到opencl缓冲区,然后用opencl kernel. 处理它们 但是我不知道如何加载视频帧,因为我从未使用过视频. 当我使用OpenCl时,我的主要重点显然是高性能! 我知道有ffmpeg或opencv等库,但是由于我不喜欢它,所以我不知道哪个最适合我的需求. 那么,您能给我建议使用哪个库/功能与opencl结合使用哪个库/功能? 我还没有发现一些有用的东西.我可以从哪里开始? (诸如简短的指导或教程之类的东西很友善) 预先感谢! 我正在使用NVIDIA卡的Linux(无需跨平台)工作,而(首选)编程语言为c++.我更喜欢h264作为视频格式,但是avi,mov,mp4,也可以. 解决方案 我的一个朋友在使用OpenGL的图像处理框架中使用FFMPEG很高兴,因此OpenCL也不有任何问题.我将选择它,而不是供应商特定的库.如果您使用OpenCV,请记住,即使不需要所有额外的内容,即
我正在尝试构建一个内核来进行并行字符串搜索.为此,我倾向于使用有限的状态机. FSM的过渡表在内核参数中指出.代码: __kernel void Find ( __constant char *text, const int offset, const int tlenght, __constant char *characters, const int clength, const int maxlength, __constant int *states, const int statesdim){ private char c; private int state; private const int id = get_global_id(0); if (id
我很难将矢量类型(UINT8)参数从c. 中的主机代码转到OpenCL内核函数 在主机中,我在数组中获得了数据: cl_uint dataArr[8] = { 1, 2, 3, 4, 5, 6, 7, 8 }; (我的真实数据不仅仅是[1,8];这仅是为了简化解释.) 然后, i然后将数据传输到缓冲区以传递到内核: cl_mem kernelInputData = clCreateBuffer(context, CL_MEM_READ_ONLY | CL_MEM_COPY_HOST_PTR, sizeof(cl_uint)*8, dataArr, NULL); 接下来,我将此缓冲区传递到内核: clSetKernelArg(kernel, 0, sizeof(cl_mem), &kernelInputData); 和内核函数的签名看起来像这样: kernel void kernelFunction(constant uint8 *vec