Tag: opencl

在openCl内核中使用“String”

我有一个关于OpenCl编程的问题。 场景是:我有一个从不同长度的文件中获取的单词列表,我必须将此列表传递给OpenCl内核。 我试图使用由包含单词的char数组和包含大小的int组成的结构。 但是这种解决方案不起作用,因为在内核中,我必须创建一个结构中指示大小的新数组,但内核不喜欢可变大小的数组。 有一种方法可以实现这个解决方案(我的意思是每个不同大小的线程创建一个数组)? 如果没有这种解决方案,我该怎么办? 谢谢 :) 编辑:这是示例代码..我希望它澄清事情 typedef struct word{ char word[100]; int len; }word_t; __kernel void test(__global word_t *data, __global res_t *result) { size_t id=get_global_id(0); int size=0; size=data[id].len; char word[size]; //working with the word } 但clBuildProgram说我不能有一个可变大小的数组..

OpenCL命令队列(CL_QUEUE_OUT_OF_ORDER_EXEC_MODE_ENABLE)无法正常工作(MacOS)

完成Fixstars的示例和源代码。 具体来说,我正在尝试第5章中的最后一点代码(两个移动平均线 – 又名Golden Cross): http://www.fixstars.com/en/opencl/book/OpenCLProgrammingBook/opencl-programming-practice/ 代码可在此处获得: http://www.fixstars.com/en/opencl/book/sample/ 我将在下面发布具体示例。 但缺点是通过设置命令队列如下: command_queue = clCreateCommandQueue(context, device_id, CL_QUEUE_OUT_OF_ORDER_EXEC_MODE_ENABLE, &ret); 导致无效的command_queue(clError)。 因此,返回数据未得到正确处理。 IE。,它全是零。 但是,如果我设置代码只计算一个移动平均值,而没有CL_QUEUE_OUT_OF_ORDER_EXEC_MODE_ENABLE ,那么事情就可以了。 相应地,本章之前的Fixstars代码似乎都可以正常工作。 我正在开发一款配备NVIDIA芯片的全新MacBook Pro(视网膜)。 所以我想知道它是否与NVIDIA实现或其他方面有关。 无论如何,它对我来说都是一个阻碍,因为我最终试图做的是触发多个(相同的)过程,每个过程都有不同的参数,这个例子通过同时计算两个股票价格移动平均线试图做同样的事情。 代码片段如下。 我已经在其源代码中添加了调试打印输出function。 所以我在程序执行时看到以下内容: 从clGetPlatformIDs返回代码:成功! 从clGetDeviceIDs返回代码:成功! 从clCreateContext返回代码:成功! 从clCreateCommandQueue返回代码:无效的值 从clBuildProgram返回代码:成功! 从clCreateKernel返回代码(13):成功! 从clCreateKernel返回代码(26):成功! 从clEnqueueTask(13)返回代码:无效的命令队列 从clEnqueueTask(26)返回代码:无效的命令队列 结果[25]:[0](0.000000,0.000000)[0](0.000000,0.000000)[0](0.000000,0.000000)[0](0.000000,0.000000) 结果[26]:[0](0.000000,0.000000)[0](0.000000,0.000000)[0](0.000000,0.000000)[0](0.000000,0.000000) 结果[27]:[0](0.000000,0.000000)[0](0.000000,0.000000)[0](0.000000,0.000000)[0](0.000000,0.000000) 结果[28]:[0](0.000000,0.000000)[0](0.000000,0.000000)[0](0.000000,0.000000)[0](0.000000,0.000000) …其余数据也都是零。 我正在编译: gcc -O2 -c moving_average_vec4p.c gcc moving_average_vec4p.o -o moving_average_vec4p -framework opencl —-(主机代码)moving_average_vec4p.c […]

在编写openCL代码时,它如何在没有GPU的单核机器上执行?

嘿所有,我目前正在将FORTRAN 77的光线跟踪器移植到C进行研究项目。 移植完要素后,问题是我们如何进行并行化。 在实验室中,我可以访问几台不同的Opteron机器,有2到8个内核,但没有GPU(目前)。 我们正在运行64b gentoo。 GPGPU版本(非常)是可取的,但项目中只有一个程序员,维护单独的非GPU和GPU版本不是一种选择。 此外,代码将是GPL,并且我们希望看到它被其他可能具有完全不同硬件的人使用。 因此,整个程序必须易于编译/运行,而无需GPU或甚至多核系统。 OpenCl似乎是一个不错的选择,因为它可以在没有GPU的机器上运行,但是这个代码将如何在单核或32b系统上运行? 是否有可能以这样的方式编写代码,以便在没有openCL的情况下轻松编译代码?

在C / openCL中使用矢量元素

我正在pyopenCL中编写一个openCL内核,我想在其中寻址向量元素。 在简单的C中,我想要的结果是: int i = 0; float *vec = (float*)maalloc(sizeof(float)*4); for (i=0;i<4;i++) { vec[i]=2*i; } 在openCL中,矢量的元素以“pythonic”点语法样式访问。 float4 vec = (float4)(0); for (i=0;i<4,i++) { vec.si = 2*i; /*obviously doesn't work*/ } 因此vec[2]在vec.s2中成为vec.s2 ,因此使用变量访问元素不再简单。 但是如何使用变量访问vector元素呢?

clCreateImage2D – 加载RGB图像

我正在尝试使用clCreateImage2D将OpenCV图像( IplImage )加载到GPU中。 使用IplImage原因是,我想加载任何类型的图像。(jpg,bmp,png)。 我可以使用clCreateImage2D和CL_MEM_READ_ONLY | CL_MEM_COPY_HOST_PTR来加载图像 CL_MEM_READ_ONLY | CL_MEM_COPY_HOST_PTR mem_flags,以及CL_RGB和CL_UNORM_SHORT_565类型。 但是在内核函数中read_imagef函数不接受CL_UNORM_SHORT_565类型。 那么,我如何将RGB图像发送到OpenCL内核函数呢? 编辑:我将输入图像转换为32位。 请问什么是image_channel_order和image_channel_data_type ? 订单不能是RGBA,因为它没有alpha通道。

OpenCL到OpenGL纹理问题

我正在尝试使用OpenCL绘制到我从OpenGL纹理获得的cl_image,然后渲染该纹理。 问题是当我在CL_DEVICE_TYPE_CPU上运行我的代码时,它工作正常但是当我在CL_DEVICE_TYPE_GPU上运行时,纹理似乎是一些随机像素。 我是OpenCL的新手,不知道发生了什么,所以我将在下面发布代码,也在OSX上使用OpenCL。 主机代码: #import “GLView.h” #import #import #import “kernel.cl.h” #define WIDTH 500 #define HEIGHT 500 static GLfloat squareVertexData[] = { -0.5f, -0.5f, 0.0f, 0.0f, 0.0f, 0.5f, -0.5f, 0.0f, 1.0f, 0.0f, 0.5f, 0.5f, 0.0f, 1.0f, 1.0f, -0.5f, -0.5f, 0.0f, 0.0f, 0.0f, 0.5f, 0.5f, 0.0f, 1.0f, 1.0f, -0.5f, 0.5f, 0.0f, 0.0f, 1.0f }; @interface GLView () […]

OpenCL C / C ++动态绑定库(win32及更多)

我正在尝试使用OpenCL,为了将其投入生产,我希望能够动态绑定到OpenCL.DLL(在Windows下),以便在没有OpenCL的情况下“优雅地”处理安装在主机上。 是否有任何可用的库(或代码片段)在C或C ++中处理这种动态绑定,就像GLEW对OpenGL一样? 我想避免自己做这件事的麻烦。 谢谢,

使用CMake安装其他文件

我试图提供一些带有一些可执行文件的“源”文件。 我想知道是否有办法将这些源文件复制到构建目录(从源目录),然后使用CMake复制到安装目录。 我在这里更具体的目标是包含我在他们自己的* .cl文件中编写的OpenCL内核。 例: mkdir build cd build cmake .. make 现在我的目录应该有一个可执行文件(标准CMake)和some_opencl_kernel.cl ,我在我的可执行文件中打开它。

OpenCL或CUDA走哪条路?

我正在研究使用GPU来处理流数据的方法。 我有两个选择,但无法决定走哪条路? 我的标准如下: 易于使用(良好的API) 社区和文件 性能 未来 我将在linux下用C和C ++编写代码。

是否可以在OpenCL中并行运行和计算?

我是OpenCL的新手。 但是,我理解C / C ++基础知识和OOP。 我的问题如下:是否有可能并行运行和计算任务? 理论上可行吗? 下面我将描述我尝试过的事情: 例如,任务是: double* values = new double[1000]; //let’s pretend it has some random values inside double sum = 0.0; for(int i = 0; i < 1000; i++) { sum += values[i]; } 我在OpenCL内核中尝试做的事情(我觉得这是错误的,因为它可能同时从不同的线程/任务访问相同的“sum”变量): __kernel void calculate2dim(__global float* vectors1dim, __global float output, const unsigned int count) { int i […]