OpenCL( 一)


#include <CL/cl.h>
#include <iostream>
#include <string>
#include <fstream>
#pragma comment(lib, "OpenCL.lib")
const char * loadfile(const char * fileName)
{
std::ifstream fs(fileName, std::ios::binary);
fs.seekg(0, std::ios::end);

int size = fs.tellg();
char * data = new char[size + 1];
fs.seekg(0);
fs.read(data, size);
fs.close();
data[size] = 0;
return data;
}

int main()
{
cl_platform_id platform;
clGetPlatformIDs(1, &platform, NULL);

cl_device_id device;
clGetDeviceIDs(platform, CL_DEVICE_TYPE_GPU, 1, &device, NULL);

cl_context context = clCreateContext(NULL, 1, &device, NULL, NULL, NULL);
cl_command_queue queue = clCreateCommandQueue(context, device, 0, NULL);

const char * clSourceFile = loadfile("H:/QtTool/build/TritonRayTracing/kernel.txt");
cl_program program = clCreateProgramWithSource(context, 1, &clSourceFile, NULL, NULL);
cl_int result = clBuildProgram(program, 1, &device, NULL, NULL, NULL);
if (result)
{
std::cout << "Error buring compilation" << std::endl;
}
cl_kernel kernel = clCreateKernel(program, "main", NULL);
cl_mem output = clCreateBuffer(context, CL_MEM_WRITE_ONLY, 10 * sizeof(cl_int), NULL, 0);
cl_mem buffer1 = clCreateBuffer(context, CL_MEM_READ_WRITE, 10 * sizeof(cl_int), NULL, 0);
cl_mem buffer2 = clCreateBuffer(context, CL_MEM_READ_WRITE, 10 * sizeof(cl_int), NULL, 0);
clSetKernelArg(kernel, 0, sizeof(output), (void *)&output);
clSetKernelArg(kernel, 1, sizeof(buffer1), (void *)&buffer1);
clSetKernelArg(kernel, 2, sizeof(buffer2), (void *)&buffer2);
cl_int * buffer1Ptr = (cl_int *)clEnqueueMapBuffer(queue,
buffer1,
CL_TRUE,
CL_MAP_WRITE,
0,
10 * sizeof(cl_int),
0, NULL, NULL, NULL);
cl_int * buffer2Ptr = (cl_int *)clEnqueueMapBuffer(queue,
buffer2,
CL_TRUE,
CL_MAP_WRITE,
0,
10 * sizeof(cl_int),
0, NULL, NULL, NULL);
for (int i = 0; i < 10; ++i)
{
buffer1Ptr[i] = i;
buffer2Ptr[i] = i;
}
clEnqueueUnmapMemObject(queue, buffer1, buffer1Ptr, 0, 0, 0);
clEnqueueUnmapMemObject(queue, buffer2, buffer2Ptr, 0, 0, 0);
size_t global_work_size = 10;
clEnqueueNDRangeKernel(queue,
kernel,
1,
NULL,
&global_work_size,
NULL, 0, NULL, NULL);
cl_int * resultBufferPtr = (cl_int *)clEnqueueMapBuffer(queue,
output,
CL_TRUE,
CL_MAP_READ,
0,
10 * sizeof(cl_int),
0, NULL, NULL, NULL);
for (int i = 0; i < 10; i++)
{
std::cout << "ptr[" << i << "] = " << resultBufferPtr[i] << std::endl;
}
return 0;
}

OpenCL( 一),布布扣,bubuko.com

时间: 2024-08-07 04:08:49

OpenCL( 一)的相关文章

OpenCL入门:(二:用GPU计算两个数组和)

本文编写一个计算两个数组和的程序,用CPU和GPU分别运算,计算运算时间,并且校验最后的运算结果.文中代码偏多,原理建议阅读下面文章,文中介绍了OpenCL相关名词概念. http://opencl.codeplex.com/wikipage?title=OpenCL%20Tutorials%20-%201  (英文版) http://www.cnblogs.com/leiben/archive/2012/06/05/2536508.html (博友翻译的中文版) 一.创建工程 按照OpenCL

面向OPENCL的ALTERA SDK

面向OPENCL的ALTERA SDK 使用面向开放计算语言 (OpenCL?) 的?Altera??SDK,用户可以抽象出传统的硬件 FPGA 开发流程,采用更快.更高层面的软件开发流程.在基于 x86 的主机上迅速完成 OpenCL 加速器代码仿真,获得详细的优化报告,包括专门的算法流水线相关信息,缩短编译时间,直至得到满意的内核代码结果.利用预先编写的最优?OpenCL?或者?RTL?功能,从主程序调用它们,或者直接从您的?OpenCL?内核调用它们. 什么是 OpenCL? OpenCL

编译GDAL支持OpenCL使用GPU加速

前言 GDAL库中提供的gdalwarp支持各种高性能的图像重采样算法,图像重采样算法广泛应用于图像校正,重投影,裁切,镶嵌等算法中,而且对于这些算法来说,计算坐标变换的运算量是相当少的,绝大部分运算量都在图像的重采样算法中,尤其是三次卷积采样以及更高级的重采样算法来说,运算量会成倍的增加,所以提升这些算法的处理效率优先是提高重采样的效率.由于GPU的多核心使得目前对于GPU的并行处理非常热,同时也能大幅度的提升处理速度.基于上述原因,GDALWARP也提供了基于OPENCL的GPU加速,之前在

配置VS2013 OpenCL环境

配置VS2013 OpenCL环境 1. 安装CUDA安装包 由于目前的CUDA安装包自带显卡驱动.CUAD工具.OpenCL的SDK:其中OpenCL的相关内容的默认目录有: CL文件夹的目录:C:\Program Files\NVIDIA GPU Computing Toolkit\CUDA\v7.0\include OpenCL.lib文件目录:C:\Program Files\NVIDIA GPU Computing Toolkit\CUDA\v7.0\lib OpenCL.dll文件目

CUDA和OpenCL异同点比较

CUDA和OpenCL异同点比较 一.概述 对CUDA和opencl有一定的编程经验,但是细心的人可以发现,OPENCL就是仿照CUDA来做的.既然两个GPU的编程框架如此相像,那么他们究竟有什么不同呢?下面就一一道来. 二.数据并行的模型 OpenCL采用的数据并行模型就是采用CUDA的数据并行模型.下面的表格反应了CUDA和opencl并行模型之间的映射关系. OpenCL CUDA Kernel函数 Kernel函数 主机程序 主机程序 N-DRange 网格 工作项 线程 工作组 线程块

GPGPU OpenCL/CUDA 高性能编程的10大注意事项

转载自:http://hc.csdn.net/contents/content_details?type=1&id=341 1.展开循环 如果提前知道了循环的次数,可以进行循环展开,这样省去了循环条件的比较次数.但是同时也不能使得kernel代码太大. 1 #include 2 using namespace std; 3 4 int main(){ 5 int sum=0; 6 for(int i=1;i<=100;i++){ 7 sum+=i; 8 } 9 10 sum=0; 11 fo

使用OpenCL+OpenCV实现图像旋转(一)

[题外话]近期申请了一个微信公众号:平凡程式人生.有兴趣的朋友可以关注,那里将会涉及更多更新OpenCL+OpenCV以及图像处理方面的文章. 最近在学习<OPENCL异构计算>,其中有一个实例是使用OpenCL实现图像旋转.这个实例中并没有涉及读取.保存.显示图像等操作,其中也存在一些小bug.在学习OpenCL之初,完整地实现这个实例还是很有意义的事情. 1.图像旋转原理 所谓图像旋转是指图像以某一点为中心旋转一定的角度,形成一幅新的图像的过程.这个点通常就是图像的中心. 由于是按照中心旋

OpenCL Device Information

1 #include <stdio.h> 2 #include <stdlib.h> 3 4 #ifdef __APPLE__ 5 #include <OpenCL/opencl.h> 6 #else 7 #include <CL/cl.h> 8 #endif 9 10 11 12 #define MEM_SIZE (128) 13 #define MAX_SOURCE_SIZE (0x100000) 14 15 int main() 16 { 17 cl_

很有趣的一个sourceforge论坛对话,主题关于libjpegturbo的opencl patch

第一个人说写了一个支持windows平台的patch,用于支持opencl解码,还没试过 这位老兄提了4个建议: 1. 是否有必要建立单独的Cl/目录?似乎应该是外部opencl toolkit提供的 2. 在新的c文件中包含license声明 3. libjpeg-turbo支持动态地指定底层算法,希望opencl也能采用这种方式实现 4. opencl的相关检测应该不暴露出来 这哥接着回复:我加单独的opencl目录是为了那些没有安装opencl sdk的哥们能够独立使用我们的版本而不需要单

OpenCL学习笔记(一):摩尔定律、异构计算与OpenCL初印象

关于摩尔定律: 摩尔定律1965年提出,晶体管密度是按照每年翻倍发展的,之后的趋势也是这样--每一代芯片的的时钟频率提高50%,而同时工艺节点减小了0.3,功耗密度翻倍(保持功耗相同的情况下,面积0.7*0.7=0.49,因此提高频率使得性能提升了):而在2000年中期之后,出现了物理尺寸更小的器件,意味着,我们没有办法保持功耗密度不变,而同时提高频率,结果我们看到自此之后,时钟频率并没有显著提高,需要通过并行来提高性能,所以多核CPU流行起来.即使是最基本的处理器,超标量和无序指令执行等高级体