ImageVerifierCode 换一换
格式:DOCX , 页数:11 ,大小:702.33KB ,
资源ID:18890457      下载积分:3 金币
快捷下载
登录下载
邮箱/手机:
温馨提示:
快捷下载时,用户名和密码都是您填写的邮箱或者手机号,方便查询和重复下载(系统自动生成)。 如填写123,账号就是123,密码也是123。
特别说明:
请自助下载,系统不会自动发送文件的哦; 如果您已付费,想二次下载,请登录后访问:我的下载记录
支付方式: 支付宝    微信支付   
验证码:   换一换

加入VIP,免费下载
 

温馨提示:由于个人手机设置不同,如果发现不能下载,请复制以下地址【https://www.bdocx.com/down/18890457.html】到电脑端继续下载(重复下载不扣费)。

已注册用户请登录:
账号:
密码:
验证码:   换一换
  忘记密码?
三方登录: 微信登录   QQ登录  

下载须知

1: 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。
2: 试题试卷类文档,如果标题没有明确说明有答案则都视为没有答案,请知晓。
3: 文件的所有权益归上传用户所有。
4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
5. 本站仅提供交流平台,并不能对任何下载内容负责。
6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

版权提示 | 免责声明

本文(AMD OpenCL大学课程5OpenCL概述 续篇Word文档格式.docx)为本站会员(b****5)主动上传,冰豆网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对上载内容本身不做任何修改或编辑。 若此文所含内容侵犯了您的版权或隐私,请立即通知冰豆网(发送邮件至service@bdocx.com或直接QQ联系客服),我们立即给予删除!

AMD OpenCL大学课程5OpenCL概述 续篇Word文档格式.docx

1、释放资源的函数是:clRelaseResource ,比如: clReleaseProgram(), clReleaseMemObject()等。错误捕捉:如果OpenCL函数执行失败,会返回一个错误码,一般是个负值,返回0则表示执行成功。我们可以根据该错误码知道什么地方出错了,需要修改。错误码在cl.h中定义,下面是几个错误码的例子.CL_DEVICE_NOT_FOUND -1CL_DEVICE_NOT_AVAILABLE -2CL_COMPILER_NOT_AVAILABLE -3CL_MEM_OBJECT_ALLOCATION_FAILURE -4下面是一个OpenCL机制的示意图程序模

2、型数据并行:work item和内存对象元素之间是一一映射关系;workgroup可以显示指定,也可以隐式指定。任务并行:kernel的执行独立于线程索引空间;用其他方法表示并行,比如把不同的任务放入队列,用设备指定的特殊的向量类型等等。同步:workgroup内work item之间的同步;命令队列中不同命令之间的同步。完整代码如下: #include stdafx.h #include stdio.hstdlib.htime.h 6:iostream 7:fstream 8: 9: using namespace std; 10: #define NWITEMS 262144 11: 12

3、: #pragma comment (lib,OpenCL.lib) 13: 14: /把文本文件读入一个string中 15: int convertToString(const char *filename, std:string& s) 16: 17: size_t size; 18: char* str; 19: 20: std:fstream f(filename, (std:fstream:in | std:binary); 21: 22: if(f.is_open() 23: 24: size_t fileSize; 25: f.seekg(0, std:end); 26: si

4、ze = fileSize = (size_t)f.tellg(); 27:beg); 28: 29: str = new charsize+1; 30: if(!str) 31: 32: f.close(); 33: return NULL; 34: 35: 36: f.read(str, fileSize); 37: 38: strsize = 0; 39: 40: s = str; 41: delete str; 42: return 0; 43: 44: printf(Error: Failed to open file %sn, filename); 45: return 1; 46

5、: 47: 48: int main(int argc, char* argv) 49: 50: /在host内存中创建三个缓冲区 51: float *buf1 = 0; 52: float *buf2 = 0; 53: float *buf = 0; 54: 55: buf1 =(float *)malloc(NWITEMS * sizeof(float); 56: buf2 =(float *)malloc(NWITEMS * sizeof(float); 57: buf =(float *)malloc(NWITEMS * sizeof(float); 58: 59: /初始化buf1

6、和buf2的内容 60: int i; 61: srand( (unsigned)time( NULL ) ); 62: for(i = 0; i NWITEMS; i+) 63: buf1i = rand()%65535; 64: 65: srand( (unsigned)time( NULL ) +1000); 66: 67: buf2i = rand()%65535; 68: 69: 70: bufi = buf1i + buf2i; 71: 72: cl_uint status; 73: cl_platform_id platform; 74: 75: /创建平台对象 76: stat

7、us = clGetPlatformIDs( 1, &platform, NULL ); 77: 78: cl_device_id device; 79: 80: /创建GPU设备 81: clGetDeviceIDs( platform, CL_DEVICE_TYPE_GPU, 82: 1, 83: &device, 84: NULL); 85: /创建context 86: cl_context context = clCreateContext( NULL, 87: 88: 89: NULL, NULL, NULL); 90: /创建命令队列 91: cl_command_queue q

8、ueue = clCreateCommandQueue( context, 92: device, 93: CL_QUEUE_PROFILING_ENABLE, NULL ); 94: /创建三个OpenCL内存对象,并把buf1的内容通过隐式拷贝的方式 95: /拷贝到clbuf1,buf2的内容通过显示拷贝的方式拷贝到clbuf2 96: cl_mem clbuf1 = clCreateBuffer(context, 97: CL_MEM_READ_ONLY | CL_MEM_COPY_HOST_PTR, 98: NWITEMS*sizeof(cl_float),buf1, 99: NUL

9、L ); 100: 101: cl_mem clbuf2 = clCreateBuffer(context, 102: CL_MEM_READ_ONLY , 103: NWITEMS*sizeof(cl_float),NULL, 104: 105: 106: status = clEnqueueWriteBuffer(queue, clbuf2, 1, 107: 0, NWITEMS*sizeof(cl_float), buf2, 0, 0, 0); 108: 109: cl_mem buffer = clCreateBuffer( context, 110: CL_MEM_WRITE_ONL

10、Y, 111: NWITEMS * sizeof(cl_float), 112: NULL, NULL ); 113: 114: const char * filename = add.cl 115:string sourceStr; 116: status = convertToString(filename, sourceStr); 117: const char * source = sourceStr.c_str(); 118: size_t sourceSize = strlen(source) ; 119: 120: /创建程序对象 121: cl_program program

11、= clCreateProgramWithSource( 122: context, 123: 124:source, 125: sourceSize, 126: 127: /编译程序对象 128: status = clBuildProgram( program, 1, &device, NULL, NULL, NULL ); 129: if(status != 0) 130: 131:clBuild failed:%dn, status); 132: char tbuf0x10000; 133: clGetProgramBuildInfo(program, device, CL_PROGR

12、AM_BUILD_LOG, 0x10000, tbuf, NULL); 134:n%sn, tbuf); 135: return -1; 136: 137: 138: /创建Kernel对象 139: cl_kernel kernel = clCreateKernel( program, vecadd, NULL ); 140: /设置Kernel参数 141: cl_int clnum = NWITEMS; 142: clSetKernelArg(kernel, 0, sizeof(cl_mem), (void*) &clbuf1); 143: clSetKernelArg(kernel,

13、1, sizeof(cl_mem), (void*) &clbuf2); 144: clSetKernelArg(kernel, 2, sizeof(cl_mem), (void*) &buffer); 145: 146: /执行kernel 147: cl_event ev; 148: size_t global_work_size = NWITEMS; 149: clEnqueueNDRangeKernel( queue, 150: kernel, 151: 152: NULL, 153:global_work_size, 154: NULL, 0, NULL, &ev); 155: cl

14、Finish( queue ); 156: 157: /数据拷回host内存 158: cl_float *ptr; 159: ptr = (cl_float *) clEnqueueMapBuffer( queue, 160: buffer, 161: CL_TRUE, 162: CL_MAP_READ, 163: 0, 164: 165: 0, NULL, NULL, NULL ); 166: /结果验证,和cpu计算的结果比较 167:memcmp(buf, ptr, NWITEMS) 168:Verify passedn); 169: else printf(verify failed

15、 170: 171: if(buf) 172: free(buf); 173: if(buf1) 174: free(buf1); 175: if(buf2) 176: free(buf2); 177: 178: /删除OpenCL资源对象 179: clReleaseMemObject(clbuf1); 180: clReleaseMemObject(clbuf2); 181: clReleaseMemObject(buffer); 182: clReleaseProgram(program); 183: clReleaseCommandQueue(queue); 184: clReleaseContext(context); 185: 186: 187:也可以在

copyright@ 2008-2022 冰豆网网站版权所有

经营许可证编号:鄂ICP备2022015515号-1