问题标签 [opencl-c]

For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.

0 投票
1 回答
212 浏览

c++ - 我怎么能使用矢量opencl c内核上的缓冲区或使用此向量设置SVM?

我正在尝试分配一个向量(字符串数组)来存储 2 个或更多字符(字节),但 OpenCL 内核的编译器(clang)kernel parameter cannot be declared as a pointer to a pointer在声明 char**compressedBytes 数组时抛出以下错误

内核: https ://gist.github.com/PontiacGTX/0f0897ac1eaf93cb04a5c1e3c205dc4b

主持人: https ://gist.github.com/PontiacGTX/745b4942acab0c7213dee1fede6a8e35

内核编译器错误是:

创建内核 1 失败

C:\Users\PONTIA~1\AppData\Local\Temp\OCL4936T1.cl:31:111: 错误:内核参数不能声明为指向指针 __kernel void CopyBytes(__global unsigned char const* fileBytes,unsigned long length ,__global unsigned char**compressedBytes, __global unsigned long* arrayCountCompressedBytes) ^

C:\Users\PONTIA~1\AppData\Local\Temp\OCL4936T1.cl:40:16:警告:不兼容的整数到指针转换初始化 'const __generic char ' 使用类型为 'int' 的表达式 const char str=fileBytes[ i] + 文件字节[i+1]; ^ ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

C:\Users\PONTIA~1\AppData\Local\Temp\OCL4936T1.cl:41:9: 警告:不兼容的指针类型将 '__global unsigned char *__generic *' 传递给 'const __global char *__generic *' 类型的参数(compressedBytes,size,str,found); ^~~~~~~~~~~~~~~

C:\Users\PONTIA~1\AppData\Local\Temp\OCL4936T1.cl:10:33:注意:在此处将参数传递给参数“开始” void Find(__global const char** begin,unsigned long length, const char* val,int 找到)^

C:\Users\PONTIA~1\AppData\Local\Temp\OCL4936T1.cl:45:23: 错误:将 'const __generic char *' 分配给 '__global unsigned char *__generic' 更改指针压缩字节的地址空间 [i]=字符串;^~~~

0 投票
1 回答
153 浏览

random - OpenCL 内核上的 drand48

有没有人有 drand48() 的实现或可以在 OpenCL 内核中工作的等价物?

我一直在通过缓冲区发送在主机上生成的随机数,但如果有任何方法可以做到这一点,我需要在设备上生成随机数。

0 投票
1 回答
224 浏览

c++ - 为什么我会从 `clSetKernelArg` 获得 `CL_INVALID_MEM_OBJECT`?

我几乎完成了将一些 CUDA 代码重写为 OpenCL 的工作。但是我得到了这个可怕的运行时错误。

我调用的内核接受如下参数:

我正在使用cl2.hppOpenCL 的包装器,当我调用clSetKernelArg参数 0 的等价物时,即proj_out返回CL_INVALID_MEM_OBJECT

切换参数 0 和 1 时,我也得到相同的结果。我尝试了三种分配设备缓冲区的方法:

h_proj_outfloat*proj_size64*64*16在测试用例中。我已经尝试了falseand truefor read_onlyand的所有 4 种组合useHostPtr

err在所有 OpenCL API 调用之后检查,之前没有错误clSetKernelArg

我已经用 gdb 逐步完成了所有组合的代码,它总是在clSetKernelArg第一个参数给出错误。

我已经尝试过NvidiaIntel CPU OpenCL 运行时。(POCL 不支持 nvidia gpus 的图像类型,所以我不能使用它)

主机代码可以在这里找到:https ://gitlab.com/agravgaard/cbctrecon/blob/master/Library/CbctReconLib/rtkExtension/rtkOpenCLForwardProjectionImageFilter.cpp#L130

OpenCL 内核: https ://gitlab.com/agravgaard/cbctrecon/blob/master/Library/CbctReconLib/rtkExtension/forward_proj.cl#L71 内核 使用英特尔 SDK for OpenCL 离线编译器编译,没有任何警告(具有相同的定义在运行时给出)。

错误发生在主机代码的第 247 行。KernelFunctor调用setArgs<>,它调用内核的 setArg,它在cl2.hpp 的第 5398 行调用 clSetKernelArg

0 投票
1 回答
57 浏览

opencl - Irregular behaviour of vectors in OpenCL(1.2) kernels

So, I am trying to perform some operation inside an OpenCL kernel. I have this buffer named filter which is a 3x3 matrix initialized with value 1.

I pass this as an argument to the OpenCL kernel from the host side. The issue is when I try to fetch this buffer on the device side as a float3 vector. For ex -

The first two temp variables behave as expected and have all their value as 1. But, the third temp variable (temp3) has only the x component as 1 and rest of the y and z components are 0. When I fetch the buffer as only a float vector, everything behaves as expected. Am I doing something wrong? I don't want to use vload instructions as they give an overhead.

0 投票
1 回答
111 浏览

c - OpenCl 内核返回异常巨大的数字

一段时间以来,我一直在尝试使用 OpenCL 内核将我的 Marching Cubes 算法从 CPU 转移到 GPU。

我遇到的问题是我的内核中的一个函数返回了奇怪的值,所以我编写了一个测试用例,在其中我指定了一个包含 12 个 float3 的数组中的可能返回值,其中 float3 分量为 0、0.5 和 1(请参见下面的代码)

出于某种原因,我得到了非常大的数字,例如,“11”的 edgeIndex 返回 float3: (-145085952., 6.600e-43#DEN, 0) 而它应该是 (1, 0, 0.5)。虽然据我所知,y 坐标基本上是 0,所以这不是问题,但是 x 坐标让我头疼。

起初我认为 OpenCL 在将给定值转换为 float3 时可能会出现问题,所以我用“.f”指定它们(例如 (float3)(0.f, 0.5f, 0.f))。这只会导致更奇怪和不同的结果,这让我觉得我必须在某个地方犯错。我对 OpenCL 还很陌生(这是我第一个使用它的真正项目),而且我也没有长时间编程,所以我希望我不会在这里犯一些新手错误,但我试图解决这个问题和相关问题几天来,我找不到解决方案。

我尽可能地缩小了问题的范围,并测试了代码是否在执行它应该执行的每个步骤。直到“CalculateEdgePos”的函数调用,一切似乎都很好,我得到了预期的结果。我剥离了所有不必要代码的功能(因此您可以忽略“值”参数,因为它现在没有被使用)但现在我已经束手无策了。

返回奇怪结果的函数:

如果你们中的任何人有任何提示或帮助,我将不胜感激。如果您需要更多代码片段,请告诉我,但我认为这应该就足够了,因为它只是指定的函数行为怪异。

亲切的问候,美食家

0 投票
0 回答
86 浏览

opencl - 试图让一些 OpenCL 代码使用 2 个 GPU

嗨,我刚刚继承了一些似乎只使用 1 个 GPU 的 OpenCL 代码,我在集群上使用 SLURM 提交它,当我提交它请求多个节点(通常为 2 个)时,程序只运行了两次。我想知道如何构建/重组代码,以便它可以利用多个 GPU。

0 投票
2 回答
479 浏览

multithreading - OpenCl 中的多线程

我已经开始研究 OpenCl,并且对 WorkGroups 和内核的工作原理有了一些基本的了解。假设我有一个大小为 1024 的向量,而我的 GPU 的 WorkGroupSize 是 256。所以我的 WorkGroupSize 是我的 VectorSize 的倍数,这作为一个例子非常有效。但在现实世界的场景中,VectorSize 不能完全被 WorkGroupSize 整除。那么如何处理此类问题呢?有没有办法传递空值以使 VectorSize 完全可以被 WorkgroupSize 整除?

0 投票
1 回答
349 浏览

c++ - OpenCL内核参数中的字符***?

我需要将 a 传递vector<vector<string>>给内核 OpenCL。最简单的方法是什么?传递 achar***给我一个错误:

错误:clBuildProgram(CL_BUILD_PROGRAM_FAILURE)

0 投票
1 回答
161 浏览

opencl - 在 CPU 上调试 OpenCL

我正在尝试按照本指南在 CPU 目标上调试 OpenCL 内核,但没有成功。内核构建,应用程序运行,但没有命中断点。有一条语句“调试器需要在调试会话开始之前设置要调试的工作项的全局 ID。”,但没有关于在何处设置或如何设置全局 ID 的信息。有人对此有一个工作样板项目或建议吗?谢谢!

0 投票
0 回答
60 浏览

c++ - OpenCL C 辅助函数似乎没有被调用或工作

当程序在编译时没有返回任何错误时,它似乎没有调用我内核上的辅助函数。

此函数是 2 个向量数组的简单点积,应将结果分配给浮点数组,但结果仍保留其默认值 (0.0)。

我错过了什么?我调用 clEnqueueWriteBuffer / clEnqueueReadBuffer 的顺序应该使它工作,除非我使用了一些错误的参数?

这是kernel.cl

资源

应用程序CL.h