Tag: opencl

OpenCL头包含C ++中的相对路径问题

我试图在Eclipse CTD上运行OpenCL C ++示例(在Mac上)包含OpenCL头,如下所示: #include 该文件存在于我的系统上(OpenCL sdk默认安装在Mac上)但不在OpenCL目录中(实际路径: /System/Library/Frameworks/OpenCL.framework/Versions/A/Headers ),所以如果我添加该路径作为项目属性中的包含目录并从#include语句中删除相关OpenCL目录,链接显然已解决, 但我注意到在该cl.h文件中,其他头文件使用相同的相对路径引用(例如OpenCL/cl_platform.h )但你可以从上面的路径看到这个OpenCL目录实际上并不存在,所以我想知道这个东西应该如何起作用。 我的问题: 在我上面的例子中,相对路径中的’OpenCL’目录是否应该存在于物理上的某个地方,或者它应该是某种环境变量或类似的,指向安装sdk的实际路径 ? 对不起,混乱,任何帮助表示赞赏! 注意:从khronos网站上的这篇文章来看,似乎OpenCL目录应该是物理存在的。

内核OpenCL中FIFO实现的最佳方法

目标:在OpenCL中实现下面显示的图表。 OpenCl内核需要的主要function是将系数数组和临时数组相乘,然后将所有这些值累加到最后。 (这可能是最耗时的操作,并行性在这里真的很有帮助)。 我正在使用内核的辅助函数进行乘法和加法(我希望这个函数也是并行的)。 图片说明: 一次一个 ,将值传递到与系数数组大小相同的数组(临时数组)中。 现在, 每次将单个值传递到此数组时,临时数组将与系数数组并行相乘,然后将每个索引的值连接成一个单独的元素。 这将继续,直到输入数组到达它的最后一个元素。 我的代码怎么了? 对于来自输入的60个元素,它需要超过8000毫秒!! 我总共需要输入120万个输入。我知道有一个更好的解决方案来做我正在尝试的事情。 这是我的代码如下。 以下是我知道他编码肯定是错误的一些事情。 当我尝试将系数值与临时数组相乘时,它会崩溃。 这是因为global_id。 我想要这条线做的只是简单地将两个数组并行。 我试图找出为什么花了这么长时间来执行FIFOfunction,所以我开始评论线路。 我首先开始评论除FIFO函数的第一个for循环之外的所有内容。 结果这耗时50毫秒。 然后,当我取消注释下一个循环时,它跳转到8000毫秒。 因此,延迟将与数据传输有关。 我可以在OpenCl中使用寄存器移位吗? 也许对整数数组使用一些逻辑移位方法? (我知道有一个’>>’运算符)。 float constant temp[58]; float constant tempArrayForShift[58]; float constant multipliedResult[58]; float fifo(float inputValue, float *coefficients, int sizeOfCoeff) { //take array of 58 elements (or same size as number of coefficients) […]

OpenCL – 将树复制到设备内存

我在C代码中实现了二进制搜索树。 我的每个树节点都是这样的: typedef struct treeNode { int key; struct treeNode *right; struct treeNode *left; } treeNode_t; 由主人制作的树的构造。 设备所做树的查询。 现在,让我们假设我已经在主机内存中完成了我的树构建。 我想将树的根复制到我的设备的内存中。 复制树的根本它是不够的。 因为右\左子不在设备内存中。 这是个问题。 所以,我的问题是将整个树复制到设备内存的最简单方法是什么?

做最后减少的策略

我正在尝试实现一个OpenCL版本来减少一个float数组。 为实现这一目标,我在网上找到了以下代码段: __kernel void sumGPU ( __global const double *input, __global double *partialSums, __local double *localSums) { uint local_id = get_local_id(0); uint group_size = get_local_size(0); // Copy from global memory to local memory localSums[local_id] = input[get_global_id(0)]; // Loop for computing localSums for (uint stride = group_size/2; stride>0; stride /=2) { // Waiting for each 2×2 […]

何时使用OpenCL API标量数据类型?

我一直无法理解何时使用cl_float,cl_uchar等OpenCL API数据类型,可在此处找到: http://www.khronos.org/registry/cl/sdk/1.0/docs/man/xhtml/scalarDataTypes.html 我看到的涉及将缓冲区复制到设备的示例如下所示: float data[DATA_SIZE]; // original data set given to device //Create the input and output arrays in device memory for our calculation input = clCreateBuffer(context, CL_MEM_READ_ONLY, sizeof(float) * count, NULL, // Write our data set into the input array in device memory err = clEnqueueWriteBuffer(commands, input, CL_TRUE, 0, sizeof(float) * count, data, […]

如何在openCL中将char *类型转换为int *

任何人都可以告诉我如何在OpenCL内核函数中对一个指向int*的char*指针进行类型转换? 我试过((int*) char_pointer)但它没有用。

OpenCL:将指针存储到本地内存中的全局内存?

任何解决方案 这有可能吗? __global *float abc; // pointer to global memory stored in private memory 我希望abc存储在本地内存而不是私有内存中。

使用#include加载OpenCL代码

我很久以前就用hlsl / glsl着色器代码看到了这一点 – 在源代码文件上使用#include将代码粘贴到char*这样在运行时就不会发生文件IO。 如果我将它表示为伪代码,它看起来有点像这样: #define CLSourceToString(filename) ” #include “filename” ” const char* kernel = CLSourceToString(“kernel.cl”); 现在当然#define不会起作用,因为它只会尝试使用这些引号来启动字符串。

使用包含浮点数组的OpenCL将struct传递给GPU

我目前有一些数据,我想传递给我的GPU,并乘以2。 我创建了一个可以在这里看到的结构: struct GPUPatternData { cl_int nInput,nOutput,patternCount, offest; cl_float* patterns; }; 此结构应包含浮点数组。 我不会知道浮动数组,直到用户指定的运行时间。 主机代码: typedef struct GPUPatternDataContatiner { int nodeInput,nodeOutput,patternCount, offest; float* patterns; } GPUPatternData; __kernel void patternDataAddition(__global GPUPatternData* gpd,__global GPUPatternData* output) { int index = get_global_id(0); if(index patternCount) { output.patterns[index] = gpd.patterns[index]*2; } } 这是主机代码: GPUPattern::GPUPatternData gpd; gpd.nodeInput = ptSet->getInputCount(); gpd.nodeOutput = ptSet->getOutputCount(); gpd.offest […]

GCC:在Windows上编译OpenCL主机

我只想尝试在Windows下使用OpenCL。 摘要 :我尝试编译时遇到了“ undefined reference to ”错误 (使用命令gcc my.o -o my.exe -L “C:\Program Files (x86)\AMD APP\lib\x86_64” -l OpenCL )。 我的代码 #include #include int main(void) { cl_platform_id platform; int err; err = clGetPlatformIDs(1, &platform, NULL); if(err < 0) { perror("There's No Platform!"); exit(1); } /* Some more code… */ system("PAUSE"); } Makefile文件 all: addition addition: gcc […]