Tag: opencl

OpenCL是否支持随机访问的全局队列缓冲区?

我正在编写一个处理组合数据的内核。 因为这些问题通常都有很大的问题空间,大多数处理过的数据都是垃圾,有没有办法可以做到以下几点: (1)如果计算的数据通过某种条件,则将其置于全局输出缓冲区。 (2)输出缓冲区满后,数据将被发送回主机 (3)主机从缓冲区中获取数据的副本并清除它 (4)然后创建一个由GPU填充的新缓冲区 为简单起见,这个例子可以说是一个选择性的内在产品,我的意思是 __global int buffer_counter; // Counts void put_onto_output_buffer(float value, __global float *buffer, int size) { // Put this value onto the global buffer or send a signal to the host } __kernel void inner_product( __global const float *threshold, // threshold __global const float *first_vector, // 10000 float vector __global […]

如何让我的GPU上的IDCT运行得更快?

我正在尝试从GPU的代码中优化IDCT。 我在NVIDIA Tesla k20c系统上使用的GPU。 原始代码中编写的IDCT函数如下所示: void IDCT(int32_t *input, uint8_t *output) { int32_t Y[64]; int32_t k, l; for (k = 0; k < 8; k++) { for (l = 0; l < 8; l++) Y(k, l) = SCALE(input[(k << 3) + l], S_BITS); idct_1d(&Y(k, 0)); } for (l = 0; l < 8; l++) { int32_t […]

定时间隔始终评估为零

主机上的代码如下: #include clock_t start,finish; start=clock(); ret = clEnqueueNDRangeKernel(………); finish=clock(); double time = (double)(finish-start)/(double)(CLOCK_PER_SEC); 为什么结束 – 始终为0? 是因为分辨率低,还是我的定时器代码有问题?

OpenCL缓冲区分配和映射最佳实践

关于使用OpenCL映射缓冲区的代码是否正确,我有点困惑。 我有两个例子,一个使用CL_MEM_USE_HOST_PTR,一个使用CL_MEM_ALLOC_HOST_PTR。 在本地计算机和OpenCL设备上都可以工作和运行,但我感兴趣的是这是否是正确的映射方式,以及它是否应该适用于所有OpenCL设备。 我对USE_HOST_PTR示例特别不确定。 我只对缓冲区/地图特定操作感兴趣。 我知道我应该做错误检查等等。 CL_MEM_ALLOC_HOST_PTR: // pointer to hold the result int * host_ptr = malloc(size * sizeof(int)); d_mem = clCreateBuffer(context,CL_MEM_READ_WRITE|CL_MEM_ALLOC_HOST_PTR, size*sizeof(cl_int), NULL, &ret); int * map_ptr = clEnqueueMapBuffer(command_queue,d_mem,CL_TRUE,CL_MAP_WRITE, 0,size*sizeof(int),0,NULL,NULL,&ret); // initialize data for (i=0; i<size;i++) { map_ptr[i] = i; } ret = clEnqueueUnmapMemObject(command_queue,d_mem,map_ptr,0,NULL,NULL); //Set OpenCL Kernel Parameters ret = clSetKernelArg(kernel, 0, sizeof(cl_mem), […]

opencl映射内存不起作用

我尝试在我的OpenCL程序中实现内存映射技术,但它不起作用! 这是我的内核代码: __kernel void update(__global char *in, __global char *out) { size_t i; for (i = 0; i < 10; i++); out[i] += 'A' – 'a'; } 这是主机代码: cl_platform_id platformId = NULL; cl_device_id deviceId = NULL; cl_context context = NULL; cl_command_queue commandQueue = NULL; cl_mem cmPinnedBufIn = NULL; cl_mem cmPinnedBufOut = NULL; cl_mem cmDevBufIn = […]

代码在Eclipse上说COULD NOT CREATE KERNEL后终止

我正在尝试将MJPEG解码器的顺序C代码转换为OpenCL。 我从这个 github项目中获得了C代码。 我现在正在尝试将IDCT的原始C代码转换为OpenCL。 我复制并粘贴了IDC的.c文件中的代码并粘贴到我命名为invCosine.cl .cl文件中。 invCosine.cl : #define IDCT_INT_MIN (- IDCT_INT_MAX – 1) #define IDCT_INT_MAX 2147483647 /* * Useful constants: */ /* * ck = cos(k*pi/16) = s8-k = sin((8-k)*pi/16) times 1 << C_BITS and * rounded */ #define c0_1 16384 #define c0_s2 23170 #define c1_1 16069 #define c1_s2 22725 …. …. …. …. […]

clGetProgramBuildInfo不打印构建日志

我在OpenCL中编写了一个代码。 构建内核程序时出错。 错误代码是-11。 我尝试打印BUILD LOG但它没有打印正确的日志,而是生成一些随机变量。 这是那部分 //these are variable declarations cl_device_id* devices; cl_program kernelprgrm; size_t size; //these varaibles have already been assigned properly //main code clGetProgramBuildInfo(kernelprgrm,devices[i], CL_PROGRAM_BUILD_LOG ,0,NULL,&size); char *buildlog=(char*)malloc(size); clGetProgramBuildInfo(kernelprgrm,devices[i], CL_PROGRAM_BUILD_LOG ,size,buildlog,NULL); printf(“\n\nBuildlog: %s\n\n”,buildlog); 它给出了以下输出: – Buildlog: 0 请帮助我获取正确的构建日志。 谢谢

Opencl:确定最佳的local_item_size

我的代码就像2d matrix muliplication( http://gpgpu-computing4.blogspot.de/2009/09/matrix-multiplication-2-opencl.html )。 矩阵的尺寸为(1000 * 1000和10000 * 10000和100000 * 100000)。 我的硬件是:NVIDIA公司GM204 [GeForce GTX 980](MAX_WORK_GROUP_SIZES:1024 1024 64)。 问题是: 我可以使用什么最好的local_item_size? size_t local_item_size[2], global_item_size[2]; global_item_size[0] = number_of_points; global_item_size[1] = number_of_points; local_item_size[0] = 10; local_item_size[1] = 10; 提前致谢,

OpenCL有效地分组下三角矩阵

我确定之前有人遇到过这个问题,基本上我有一个2D优化网格NxM,其约束条件是n_i <= m_i,即我只想计算矩阵下三角形部分的对。 目前我天真地只在M个工作组的N个本地组中实现所有NxM组合(然后使用localGroupID和workGroupID来标识该对),然后如果约束无法保存计算则返回-inf。 但有没有更好的方法来设置线程并索引它们,所以我只需要生成(NXM)/ 2线程而不是完整的NxM。 非常感谢Sam

OpenCL限制为循环大小?

UPDATE: clEnqueueReadBuffer(command_queue, c_mem_obj, CL_TRUE, 0, LIST_SIZE * sizeof(double), C, 0, NULL, NULL); 返回-5, CL_OUT_OF_RESOURCES 。 这个函数/调用应该永远不会返回! 我已经开始使用OpenCL并遇到了一个问题。 如果我允许for循环(在内核中)运行10000次,那么如果我允许循环运行8000,则所有C都为0,结果都是正确的。 我已经在内核周围添加了等待以确保它完成,认为我在完成之前将数据拉出并尝试了Clwaitforevent和CLFinish。 任何呼叫都不会发出任何错误信号。 当我使用int时,for循环将工作在4000000的大小。浮点数和双打有相同的问题但是浮点数工作在10000,但不是20000,当我使用浮点数时我删除了#pragma OPENCL EXTENSION cl_khr_fp64 : enable to check那不是问题。 这是一些奇怪的记忆事,我是否使用OpenCL错了? 我意识到在大多数内核中我都不会像这样实现循环,但这似乎是一个问题。 我也删除了__private ,看看是不是问题,没有变化。 那么OpenCL内核中for循环的大小是否有限制? 硬件是否具体? 或者这是一个错误? 内核是一个简单的内核,它将2个数组(A + B)加在一起并输出另一个(C)。 为了获得性能感觉,我在每次计算周围放置一个for循环来减慢它/增加每次运行的操作数。 内核的代码如下: #pragma OPENCL EXTENSION cl_khr_fp64 : enable __kernel void vector_add(__global double *A, __global double *B, __global […]