OpenCL 存储器次序的验证
▶ 《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 存储器次序的验证的更多相关文章
- CUDA与OpenCL架构
CUDA与OpenCL架构 目录 CUDA与OpenCL架构 目录 1 GPU的体系结构 1.1 GPU简介 1.2 GPU与CPU的差异 2 CUDA架构 2.1 硬件架构 2.1.1 GPU困境 ...
- [区块链] 共识算法之争(PBFT,Raft,PoW,PoS,DPoS,Ripple)
近几天对区块链中几种常见的共识机制(PBFT,Raft,PoW,PoS,DPoS,Ripple)进行了总结.尽量使用简单易懂语言,篇幅较大,想了解的可以只读每个算法介绍中前边的原理.本篇文章主要参考& ...
- 使用Powermock和mockito来进行单元测试
转载:http://blog.csdn.net/u013428664/article/details/44095889 简介 Mockito是一个流行的Mocking框架.它使用起来简单,学习成本很低 ...
- Nepxion Discovery【探索】微服务企业级解决方案
Nepxion Discovery[探索]微服务企业级解决方案] Nepxion Discovery[探索]使用指南,基于Spring Cloud Greenwich版.Finchley版和Hoxto ...
- ISO/IEC 9899:2011 条款6.5.16——赋值操作符
6.5.16 赋值操作符 语法 1.assignment-expression: conditional-expression unary-expression assignment-opera ...
- ISO/IEC 9899:2011 条款6.5.2——后缀操作符
6.5.2 后缀操作符 语法 1.postfix-expression: primary-expression postfix-expression [ expression ] p ...
- 区块链知识博文1: 共识算法之争(PBFT,Raft,PoW,PoS,DPoS,Ripple)
注:这是本人读到的关于共识算法最全和最好的分享博文,系统的介绍了拜占庭容错技术以及共识算法的原理和常用共识算法,原文链接请见后. 目录 一.拜占庭容错技术(Byzantine Fault Tolera ...
- OpenCL使用CL_MEM_USE_HOST_PTR存储器对象属性与存储器映射
随着OpenCL的普及,现在有越来越多的移动设备以及平板.超级本等都支持OpenCL异构计算.而这些设备与桌面计算机.服务器相比而言性能不是占主要因素的,反而能耗更受人关注.因此,这些移动设备上的GP ...
- 关于OpenCL中三重循环的执行次序
源自OpenGPU社区的一个帖子的讨论: 一个有意思的openCL问题
随机推荐
- B. Beautiful Paintings
time limit per test 1 second memory limit per test 256 megabytes input standard input output standar ...
- Sort An Unsorted Stack
Given a stack of integers, sort it in ascending order using another temporary stack. Examples: Input ...
- LG4768 [NOI2018]归程
题意 题目背景 本题因为一些原因只能评测16组数据. 剩下的四组数据:https://www.luogu.org/problemnew/show/U31655 题目描述 本题的故事发生在魔力之都,在这 ...
- JS常用功能
1.字符串转Json var json='[{"id":0,"text":"ddddd"},{"id":1," ...
- Linux块设备驱动_WDS
推荐书:<Linux内核源代码情景分析> 1.字符设备驱动和使用中等待某一事件的方法①查询方式②休眠唤醒,但是这种没有超时时间③poll机制,在休眠唤醒基础上加一个超时时间④异步通知,异步 ...
- day10 python学习 函数的嵌套命名空间作用域 三元运算 位置参数 默认参数 动态参数
1.三元运算 #1.三元运算 利用已下方法就可以实现一步运算返回a b中大的值 def my_max(a,b): c=0 a=int(input('请输入')) b=int(input('请输入')) ...
- web 分享代码片段
<div class="bshare-custom icon-medium-plus"><a title="分享到QQ空间" class=&q ...
- Spring Cloud Netflix项目进入维护模式
任何项目都有其生命周期,Spring Could Netflix也不例外,官宣已进入维护模式,如果在新项目开始考虑技术选型时要考虑到这点风险,并考虑绕道的可能性. 原创: itmuch IT牧场 这 ...
- 从windows到linux的shell脚本编码和格式问题
从windows到linux的shell脚本编码和格式问题 从windows到Linux的shell脚本编码和格式问题 1.异常问题 :set ff=unix 启动脚本在启动时报错比如执行sh s ...
- 【linux】vim/vi常用指令
0或者"Home”键:光标转移到此段的最前面字节处. $或者"End"键:光标转移到此段的最后面字节处. n<space>:光标向后移动n个字节. n< ...