文档章节

OpenCL 矢量存取

o
 osc_z1hvg4cu
发布于 2018/04/24 16:16
字数 486
阅读 14
收藏 0

精选30+云产品,助力企业轻松上云!>>>

▶ 函数 vloadn 和 vstoren 来实现全局存储器和局部存储器之间的向量拷贝

● 代码

 1 #include <stdio.h>  
 2 #include <stdlib.h>
 3 #include <cl.h>
 4 
 5 const int nElement = 4096;
 6 const char *programSource = "                           \
 7 __kernel void prog(__global int *A, __global int *B)    \
 8 {                                                       \
 9     int idx = get_global_id(0);                         \
10     int4 temp = vload4(idx, A);                         \
11     vstore4(temp, idx, B);                              \
12     return;                                             \
13 }                                                       \
14 ";
15 
16 int main()
17 {
18     const size_t datasize = sizeof(int) * nElement;
19     int i, *A, *B;
20     cl_int status;
21 
22     A = (int*)malloc(datasize);
23     B = (int*)malloc(datasize);
24     for (i = 0; i < nElement; A[i] = i, B[i] = 0, i++);
25 
26     cl_platform_id platform;
27     clGetPlatformIDs(1, &platform, NULL);
28     cl_device_id device;
29     clGetDeviceIDs(platform, CL_DEVICE_TYPE_ALL, 1, &device, NULL);
30     cl_context context = clCreateContext(NULL, 1, &device, NULL, NULL, &status);
31     cl_command_queue cmdQueue = clCreateCommandQueue(context, device, 0, &status);
32     cl_mem bufferA, bufferB;
33     bufferA = clCreateBuffer(context, CL_MEM_READ_ONLY, datasize, NULL, &status);
34     bufferB = clCreateBuffer(context, CL_MEM_WRITE_ONLY, datasize, NULL, &status);
35     clEnqueueWriteBuffer(cmdQueue, bufferA, CL_FALSE, 0, datasize, A, 0, NULL, NULL);
36     cl_program program = clCreateProgramWithSource(context, 1, &programSource, NULL, &status);
37     status = clBuildProgram(program, 1, &device, NULL, NULL, NULL);    
38     cl_kernel kernel = clCreateKernel(program, "prog", &status);
39     clSetKernelArg(kernel, 0, sizeof(cl_mem), &bufferA);
40     clSetKernelArg(kernel, 1, sizeof(cl_mem), &bufferB);
41     size_t globalSize[1] = { nElement }, localSize[1] = { 128 };
42     status = clEnqueueNDRangeKernel(cmdQueue, kernel, 1, NULL, globalSize, localSize, 0, NULL, NULL);
43     clEnqueueReadBuffer(cmdQueue, bufferB, CL_TRUE, 0, datasize, B, 0, NULL, NULL);
44 
45     for (i = 0; i < nElement; i++)
46     {
47         if (B[i] != i)
48             break;
49     }
50     printf("Output is %s.\n", (i == nElement) ? "correct" : "incorrect");
51 
52     free(A);
53     free(B);
54     clReleaseContext(context);
55     clReleaseMemObject(bufferA);
56     clReleaseMemObject(bufferB);
57     clReleaseCommandQueue(cmdQueue);
58     clReleaseProgram(program);
59     clReleaseKernel(kernel);
60     getchar();
61     return 0;
62 }

● 输出结果

Output is correct.

● 教训

■ 核函数代码中每个 "\" 的后面不要有任何东西,包括空格。因为 "\" 在预处理以后会消失,其后的内容会被当成下一行的内容,而空格会在IDE中使 "\" 失效,导致编译错误
■ 核函数代码中不要有 "//" 型的行注释,理由类似。会使得 "//" 以后的代码全部失效
■ 可以改用字符串连接来写核函数代码,如:

1 const char *programSource =
2 "__kernel void prog(__global int *A, __global int *B)   \n"
3 "{                                                      \n"
4 "    int idx = get_global_id(0);                        \n"
5 "    int4 temp = vload4(idx, A);                        \n"
6 "    vstore4(temp, idx, B);                             \n"
7 "    return;                                            \n"
8 "}                                                      \n"
9 ";                                                      \n"

 

o
粉丝 0
博文 500
码字总数 0
作品 0
私信 提问
加载中
请先登录后再评论。
Android AARCH64 平台的 OpenCL 配置

原文地址:Android AARCH64 平台的 OpenCL 配置 Android AARCH64 平台的 OpenCL 配置 开发环境 IDE: Android Studio 3.4.1 Android: 7.1 minSdkVersion: 25 targetSdkVersion: 26 JNI CMake:......

osc_xwq1jmh4
2019/07/04
5
0
OpenCL(CPU)

Open Computing Language (OpenCL) is a framework for writing programs that execute across heterogeneous computing platforms (CPUs, GPUs, DSPs, FPGAs, ASICs, ...) OpenCL library/a......

赵-猛
2018/08/12
0
0
OpenCL 1.2正式发布,并行加速计算新标准

Khronos Group今天宣布,已经批准并公开发布了现代处理器的跨平台、并行计算编程标准“OpenCL 1.2”,当然继续开放、免版税。OpenCL 1.1发布十八个月后,在三十多家行业领先企业的共同努力下...

小卒过河
2011/11/17
2.3K
3
Qualcomm_Mobile_OpenCL.pdf 翻译-2

2 Opencl的简介 这一章主要讨论Opencl标准中的关键概念和在手机平台上开发Opencl程序的基础知识。如果想知道关于Opencl更详细的知识,请查阅参考文献中的《The OpenCL Specification》。对于...

osc_u94h44ck
2019/06/06
5
0
OpenVX

OpenVX openvx 1. 编译 尝试编译openvx_sample,下载相关代码。 下载的sample code直接使用make可以生成libopenvx.so。 使用python Build.py --os linux可以编译sample code。 2. OpenVX使用...

osc_6x8y8c2x
2018/07/27
0
0

没有更多内容

加载失败,请刷新页面

加载更多

平时使用的Lszrz到底是什么协议?说说Xmodem/Ymodem/Zmodem

XMODEM, YMODEM, and ZMODEM 由于平时使用rz/sz较多,r/s好理解,一个send一个receive。但是由不太清楚z是什么意思,故有此文。 sx/rx, sb/rb (b=batch)和sz/rz分别实现了xmodem,ymodem和z...

独钓渔
今天
17
0
真正的强智能时代已经到来。道翰天琼认知智能机器人平台API大脑。

最近,我常说人工智能的寒冬快要来了,提醒业界要做好思想准备,但同时我也说:冬天来了,春天就不会远了…… 2019年6月我写了篇文章《深度学习的问题究竟在哪?》,说到深度学习的一个主要问...

jackli2020
今天
24
0
什么是控制型人格,控制型人格的筛查测试

一、 什么是控制性人格 拥有控制型人格的人,他们会尽力的隐藏自己的意图,但是又会使用很微妙的方式来利用周围人的弱点,进而占取便宜时,使他们能够得到自己想要的东西。这类人的控制欲非常...

蛤蟆丸子
今天
14
0
【Spring】Spring AOP 代理对象生成逻辑源码分析

1. spring aop案例(POJO注入) 1.0 被代理接口 TargetInterface /** * 被代理的接口 * @author Yang ZhiWei */public interface TargetInterface { void show(); String show......

ZeroneLove
今天
36
0
聊聊dubbo-go的gracefulShutdownFilter

序 本文主要研究一下dubbo-go的gracefulShutdownFilter gracefulShutdownFilter dubbo-go-v1.4.2/filter/filter_impl/graceful_shutdown_filter.go type gracefulShutdownFilter struct {......

go4it
今天
30
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部