▶ 《OpenCL异构并行编程实战》P224 的代码,先放上来,坐等新设备到了再执行

 //kernel.cl
__global volatile atomic_int globalAtom = ATOMIC_VAR_INIT(); // 全局原子对象
__kernel void memoryOrderTest01(__global int *dst)
{
__local volatile atomic_int localAtom; // 本地原子对象
atomic_init(&localAtom, );
const int gid = get_global_id();
work_group_barrier(CLK_LOCAL_MEM_FENCE);
if (gid == ) // 0 号工作项尝试写入 1
{
atomic_store_explicit(&localAtom, , memory_order_seq_cst, memory_scope_work_group);
atomic_store_explicit(&globalAtom, , memory_order_seq_cst, memory_scope_device);
}
//atomic_work_item_fence(CLK_LOCAL_MEM_FENCE, memory_order_acq_rel, memory_scope_work_group);
if (gid == )
{
int a, count;
for (a = , count = ; a == && count < ; count++)
a = atomic_load_explicit(&localAtom, memory_order_seq_cst, memory_scope_work_group);
dst[] = !!a;
dst[] = count;
for (count = ; a == && count < ; count++)
a = atomic_load_explicit(&globalAtom, memory_order_seq_cst, memory_scope_device);
dst[] = !!a;
}
work_group_barrier();// 必须添加,将 0 号工作项的副作用暴露给其他工作项
} __kernel void memoryOrderTest02(__global int *dst)
{
__local volatile atomic_int localAtom;
atomic_init(&localAtom, );
const int gid = get_global_id();
work_group_barrier(CLK_LOCAL_MEM_FENCE);
if (gid == )
{
atomic_store(&localAtom, );
atomic_store(&globalAtom, );
}
//atomic_work_item_fence(CLK_LOCAL_MEM_FENCE, memory_order_acq_rel, memory_scope_work_group);
if (gid == )
{
int a, count;
for (a = , count = ; a == && count < ; count++)
a = atomic_load(&localAtom);
dst[] = !!a;
dst[] = count;
for (count = ; a == && count < ; count++)
a = atomic_load(&globalAtom);
dst[] = !!a;
}
work_group_barrier();
}
 //main.c
#include <stdio.h>
#include <stdlib.h>
#include <cl.h> const char *sourceCode = "D:/Code/kernel.cl"; int readSource(const char* kernelPath, char *source)// 读取文本文件,存储为 char *,返回代码长度
{
FILE *fp;
long int size;
//printf("readSource, Program file: %s\n", kernelPath);
fopen_s(&fp, kernelPath, "rb");
if (!fp)
{
printf("Open kernel file failed\n");
exit(-);
}
if (fseek(fp, , SEEK_END) != )
{
printf("Seek end of file faildd\n");
exit(-);
}
if ((size = ftell(fp)) < )
{
printf("Get file position failed\n");
exit(-);
}
rewind(fp);
if ((source = (char *)malloc(size + )) == NULL)
{
printf("Allocate space failed\n");
exit(-);
}
fread(source, , size, fp);
fclose(fp);
source[size] = '\0';
return size + ;
} int main()
{
const int nElement = , dataSize = nElement * sizeof(float);
int i, host[nElement] = { };
char info[]; // 初始化平台
cl_int status;
cl_platform_id platform;
clGetPlatformIDs(, &platform, NULL);
cl_device_id device[];
clGetDeviceIDs(platform, CL_DEVICE_TYPE_ALL, , device, NULL);
cl_context_properties contextProp[] = { CL_CONTEXT_PLATFORM,(cl_context_properties)(platform), };
cl_context context = clCreateContext(contextProp, , device, NULL, contextProp, &status);
cl_command_queue_properties queueProp = ;// useless
cl_command_queue queue = clCreateCommandQueueWithProperties(context, device[], NULL, &status); cl_mem buffer = clCreateBuffer(context, CL_MEM_WRITE_ONLY, dataSize, NULL, &status); char *source;
size_t sourceLength = readSource(sourceCode, source);
cl_program program = clCreateProgramWithSource(context, , &source, &sourceLength, &status);
status = clBuildProgram(program, , device, "-cl-std=CL2.0", NULL, NULL);
if (status)
{
clGetProgramBuildInfo(program, device[], CL_PROGRAM_BUILD_LOG, , info, NULL);
printf("Build log:\n%s\n", info);
}
cl_kernel kernel = clCreateKernel(program, "memoryOrderTest", &status);
clSetKernelArg(kernel, , sizeof(cl_mem), buffer);
size_t globalSize = nElement, localSize = ;
clEnqueueNDRangeKernel(queue, kernel, , NULL, &globalSize, &localSize, , NULL, NULL);
clFinish(queue); clEnqueueReadBuffer(queue, buffer, CL_TRUE, , dataSize, host, , NULL, NULL); printf("Local memory result: %d, global memory result: %d, waiting count: %d\n", host[], host[], host[]); clReleaseContext(context);
clReleaseCommandQueue(queue);
clReleaseProgram(program);
clReleaseKernel(kernel);
clReleaseMemObject(buffer);
getchar();
return ;
}

OpenCL 存储器次序的验证的更多相关文章

  1. CUDA与OpenCL架构

    CUDA与OpenCL架构 目录 CUDA与OpenCL架构 目录 1 GPU的体系结构 1.1 GPU简介 1.2 GPU与CPU的差异 2 CUDA架构 2.1 硬件架构 2.1.1 GPU困境 ...

  2. [区块链] 共识算法之争(PBFT,Raft,PoW,PoS,DPoS,Ripple)

    近几天对区块链中几种常见的共识机制(PBFT,Raft,PoW,PoS,DPoS,Ripple)进行了总结.尽量使用简单易懂语言,篇幅较大,想了解的可以只读每个算法介绍中前边的原理.本篇文章主要参考& ...

  3. 使用Powermock和mockito来进行单元测试

    转载:http://blog.csdn.net/u013428664/article/details/44095889 简介 Mockito是一个流行的Mocking框架.它使用起来简单,学习成本很低 ...

  4. Nepxion Discovery【探索】微服务企业级解决方案

    Nepxion Discovery[探索]微服务企业级解决方案] Nepxion Discovery[探索]使用指南,基于Spring Cloud Greenwich版.Finchley版和Hoxto ...

  5. ISO/IEC 9899:2011 条款6.5.16——赋值操作符

    6.5.16 赋值操作符 语法 1.assignment-expression: conditional-expression unary-expression    assignment-opera ...

  6. ISO/IEC 9899:2011 条款6.5.2——后缀操作符

    6.5.2 后缀操作符 语法 1.postfix-expression: primary-expression postfix-expression    [    expression    ] p ...

  7. 区块链知识博文1: 共识算法之争(PBFT,Raft,PoW,PoS,DPoS,Ripple)

    注:这是本人读到的关于共识算法最全和最好的分享博文,系统的介绍了拜占庭容错技术以及共识算法的原理和常用共识算法,原文链接请见后. 目录 一.拜占庭容错技术(Byzantine Fault Tolera ...

  8. OpenCL使用CL_MEM_USE_HOST_PTR存储器对象属性与存储器映射

    随着OpenCL的普及,现在有越来越多的移动设备以及平板.超级本等都支持OpenCL异构计算.而这些设备与桌面计算机.服务器相比而言性能不是占主要因素的,反而能耗更受人关注.因此,这些移动设备上的GP ...

  9. 关于OpenCL中三重循环的执行次序

    源自OpenGPU社区的一个帖子的讨论: 一个有意思的openCL问题

随机推荐

  1. jquery的常用操作(操作html页面的Dom对象的元素)

    一:页面加载完成时,会执行jquery的方法(不需要等待图片加载完成,只要dom结构加载完成,就执行该方法) //第一种写法: $(document).ready(function() { // 执行 ...

  2. LG2044 [NOI2012]随机数生成器

    题意 栋栋最近迷上了随机算法,而随机数是生成随机算法的基础.栋栋准备使用线性同余法(Linear Congruential Method)来生成一个随机数列,这种方法需要设置四个非负整数参数m,a,c ...

  3. systemd学习笔记

    一.systemd介绍 systemd即为system daemon,是linux下的一种init软件与多数发行版使用的System V风格init相比,systemd采用了以下新技术: (1) 采用 ...

  4. goss 简单快捷的服务器测试检验工具

    goss 是一个简单.快捷的服务器测试检验工具,dgoss 是一个包装可以支持基于容器的开发模式 同时可以暴露测试结果为一个http endpoint,比较方便. 使用goss容器运行 使用数据卷的模 ...

  5. oracle之 手动创建 emp 表 与 dept 表

    说明: 有时候我们需要通用的实验数据,emp表 与 dept表  但是数据库中有没有. 这时,我们可以手动创建. -- 创建表与数据CREATE TABLE EMP(EMPNO NUMBER(4) N ...

  6. idea中,war 与 war exploded 区别

    idea中,war 与 war exploded 区别: war模式:将WEB工程以包的形式上传到服务器 : war exploded模式:将WEB工程以当前文件夹的位置关系上传到服务器:其实访问的是 ...

  7. JQuery获得内容 - text()、html() 以及 val()

    获得text()和html() <!DOCTYPE html><html><head><script src="/jquery/jquery-1.1 ...

  8. OSI7层封包解包动态图-数据在网络中的传输过程.gif

  9. 管道和FIFO 一

    管道和FIFO   管道(pipe)       管道在Unix及Linux进程间通信是最基础的,很容易理解.管道就像一个自来水管,一端注入水,一端放出水,水只能在一个方向上流动,而不能双向流动.管道 ...

  10. linux svn安装(转载)

    第一章 安装 1. 采用源文件编译安装.源文件共两个,为:subversion-1.6.1.tar.gz (subversion 源文件)subversion-deps-1.6.1.tar.gz (s ...