精华内容
下载资源
问答
  • 原子命令很重要的用途就是互斥(mutexes)。互斥保证了每次只有一个work-item能访问数据。opencl也支持原子命令,在opencl最初始的版本1.0,原子命令是作为扩展功能(opencl extensions)来提供的(参见cl_khr_global_int...

    原子命令很重要的用途就是互斥(mutexes)。互斥保证了每次只有一个work-item能访问数据。opencl也支持原子命令,在opencl最初始的版本1.0,原子命令是作为扩展功能(opencl extensions)来提供的(参见cl_khr_global_int32_base_atomics,cl_khr_global_int32_extended_atomics)。到opencl1.2以后,原子命令作为Atomic Functions成为opencl的内置函数(built-in function)。
    关于原子命令的概念,opencl中原子命令的使用方法不是本文讨论的重点,而是要说说在opencl用原子命令实现的自旋锁(spinlock)的使用限制。

    自旋锁(spinlock)

    opencl下实现自旋很简单,下面的代码示例了自锁旋的加锁和解锁:

    #pragma OPENCL EXTENSION cl_khr_global_int32_base_atomics : enable
    __kernel void atom_test(__global int* mutex){
      while(1==atom_cmpxchg(mutex,0,1));//自旋锁加锁,当*mutex为1时,work-item被阻塞
      //。。。。
      atom_xchg(mutex,0);//自旋锁解锁,将*mutex置为0
    }

    死锁?why?

    上面的代码看着挺简单,跟我们在主机端用的自旋锁没什么区别呀。
    但是,这段代码在GPU上运行时工作组(work group)中的工作项(work-item)数目大于1的时候,是不能正常工作的,直接导致设备死锁无响应。

    要搞清楚为什么简单的自旋锁在kernel中不能正常运行原原因,就要从GPU的中工作项的内存访问机制说起。
    我们知道,一个工作组的工作项都是在同一个计算单元(CU)上运行的,对于GPU的工作项来说,读写内存是个很耗时的过程(尤其是全局内存)。为了提高内存读写效率,同一个工作组中的每个工作项的单个的读写内存操作会被计算单元合并成整个工作组的一次内存操作。
    换句话说,从计算单元(CU)的角度来看,计算单元(CU)上运行的每个处理元件(PE)的一次内存访问最终都被合并成以计算单元为单位的一次内存操作。
    你还可以理解为每个PE(或work-item)都不能独立地访问内存,必须步调一致的同时访问内存。
    如果要举个更形象的例子,就像”挷腿跑”比赛
    这里写图片描述

    每个队员的双腿是与相邻的队员挷在一起的,所以每个队员并不能独立自由的迈开双腿,必须与全队的保持步调一致全队的跑起来速度才能最快,
    对于一般的内存访问这并没有什么问题。但是对于自旋锁就成了问题:
    每个PE(或work-item)都不能独立地访问内存,必须步调一致的同时访问内存(而且执行的是原子命令,光想想我的逻辑思维就已经混乱了),会导致它们不能分别执行加锁和解锁的动作,最后的结果就是设备死锁无响应。

    总结

    在opencl使用自旋锁的原则是:
    对于全局内存(global memory)中的mutext变量,每个work-group只能有一个work-item去访问这个自旋锁变量,超过一个work-item访问mutex变量就会造成GPU死锁。从CU的角度来说,就是同一个CU中只能有一个PE去访问自旋锁变量,否则就会造成GPU死锁。并且工作组(work-group)的数目不能超过计算单元(CU)的数量。
    对于局部内存(local memory)中的变量,不能使用自旋锁。(因为只允许一个work-item访问这个局部自旋锁变量是没有实际意义的)。

    建议:避免使用自旋锁

    其实看到自旋锁在opencl上应用有这么多限制,就能想到自旋锁并不适合在opencl kernel中使用。以我最近的惨痛教训来看,在kernel中使用自旋锁,造成kernel执行性能有几个数量级的下降。
    如果你在kernel设计中用到了自旋锁,那么你的代码结构很可能是不太合理的。建议你重新审视你的代码,避免用到自旋锁,这就是我最近折腾一个星期得到的教训。

    展开全文
  • Redis命令原子执行:Lua脚本的支持

    千次阅读 2019-03-09 10:36:15
    Redis2.6版本引入对Lua脚本的支持,可以在Redis客户端使用Lua脚本,直接在服务端原子地执行多个Redis命令。 执行命令为:EVAL或者EVALSHA,如下: 127.0.0.1:6379> EVAL "return redis.call('...
    • Redis2.6版本引入对Lua脚本的支持,可以在Redis客户端使用Lua脚本指定多个Redis命令,然后直接在服务端原子地执行这多个Redis命令。

    • 执行命令为:EVAL或者EVALSHA,如下:

      127.0.0.1:6379> EVAL "return redis.call('DBSIZE')" 0
      (integer) 94716
      
    • lua脚本相关的其他命令:SCRIPT FLUSH/EXISTS/LOAD/KILL

    • Redis对lua支持的内部实现:lua使用Redis提供的redis.call, redis.pcall来执行Redis命令,如上面的例子。在Redis内部集成了一个lua环境,在lua环境中包含一个Redis伪客户端用于执行Redis命令。lua脚本将redis.call或redis.pcall中包含的命令发送给这个伪客户端,伪客户端将命令传给命令执行器执行该命令。

    • EVAL命令内部实现:为脚本创建函数,将脚本保存到lua_scripts脚本字典中,执行该函数从而来执行脚本。

    展开全文
  • 在某些lammps模拟中,需要设置固定层...这种情况可以使用set命令改变原子的类型。 语法为: set group group-ID type N 使用这条命令之前,先将要改变类型的原子归入到一个group内。 例如将left组原子类型设为2: set

    在某些lammps模拟中,需要设置固定层,为了能够清楚的显示固定层,通常需要把固定层原子设定为不同颜色。
    在这里插入图片描述

    解决的方法有两种,最简单的一种方法是使用create_atoms时选择和基体原子不一样的原子类型。
    如果晶体结构是通过其他建模软件生成,直接由data文件读入,那么,刚才那种方法就不适用了。
    这种情况可以使用set命令改变原子的类型。
    语法为:

    set group group-ID type N
    

    使用这条命令之前,先将要改变类型的原子归入到一个group内。
    例如将left组原子类型设为2:

    set roup left type 2
    

    下面以Al板建模为例,演示set命令使用方法:

    #模型基本设置
    units			metal
    boundary		p p p
    atom_style		atomic
    timestep		0.001
    neighbor		2.0 bin
    neigh_modify	delay 0 every 5 check yes
    #创建Al板结构
    lattice			fcc 4.05
    region			box block 0 5 0 20 0 20
    create_box		3 box
    create_atoms    1 region box
    #划分上下两个区域
    region			left block INF INF INF INF 2 INF 
    region			right block INF INF INF INF 18 INF
    #原子分组
    group			left region left
    group			right region right
    #set命令
    set				group left type 2
    set				group right type 3
    #设置摩尔质量
    mass			* 27  #Al
    #保存原子数据
    write_data		all.data
    

    更多lammps教程,扫码关注微信公众号:lammps加油站
    在这里插入图片描述

    展开全文
  • 原子地多个命令

    2011-02-10 01:59:29
    ... I'm writing this feature by first removing all the employees and then adding back in each employee that is in the table if the group is modified. But I want to make sure that all the commands go ...
  • lua脚本保证Redis多条命令原子

    千次阅读 2019-10-16 14:44:11
    lua脚本保证Redis多条命令原子性 Redis能执行lua脚本,一段lua脚本可以作为一个整体,这样将多条Redis命令写入lua,即可以实现事务的原子性,下面演示了jedis和redisTemplate是如何调用lua脚本的 Jedis调用lua脚本...

    lua脚本保证Redis多条命令原子性

    Redis能执行lua脚本,一段lua脚本可以作为一个整体,这样将多条Redis命令写入lua,即可以实现事务的原子性,下面演示了jedis和redisTemplate是如何调用lua脚本的

    Jedis调用lua脚本

    # 完成的功能是 set my_key1 my_value1 EX 15 NX, LUA脚本很神奇不需要加分号和换行符
    # 其实该功能在Jedis的API里实现了,但是在spring-data-redis的API里未实现
    # Jedis的API  public String set(final String key, final String value, final String nxxx, final String expx,final long time)  , 这个nxxx即NX或XX, expx即EX或PX
    Jedis j = getJedis();
    String script = "local key = KEYS[1]" + 
        "local value = ARGV[1]" + 
        "local expireInSecs = ARGV[2]" + 
        "return redis.call(\"set\",key,value,\"EX\",expireInSecs,\"NX\")";
    List<String> keys = Arrays.asList("my_key1");
    List<String> args = Arrays.asList("my_value1", "15");
    Object ret = j.eval(script, keys, args);
    System.out.println(ret);
    

    spring-data-redis(redisTemplate)方式调用lua脚本

    # 目前该代码存在一个问题, 不知为何拿不到返回值
    # 可以传入DefaultRedisScript,其是 RedisScript 的实现,无需自己实现RedisScript的所有接口
    List<String> keys = Arrays.asList("my_key1");
    String[] args = {"my_value1_中文", "15"};
    String scriptText = "local key = KEYS[1]" + 
    		"local value = ARGV[1]" + 
    		"local expireInSecs = ARGV[2]" + 
    		"return redis.call(\"set\",key,value,\"EX\",expireInSecs,\"NX\")";
    //ScriptSource scriptSource = new ResourceScriptSource(new ClassPathResource("/lua/lock1.lua"));
    DefaultRedisScript<String>  script = new DefaultRedisScript<String>();
    script.setResultType(String.class);// 【注意】一定要设置,否则返回值都是null
    script.setScriptText(scriptText);
    String s = jedisUtil.redisTemplate.execute(script, keys, args);
    System.out.println(s);
    System.out.println(jedisUtil.string.get("my_key1"));// 中文正确
    return responseResult(s);
    
    展开全文
  • 本文介绍的关于linux命令中write调用的原子性的详细描述,具体内容如下所述。 UNIX环境高级编程中关于原子操作的介绍,其中有一种情形是在文件尾端添加数据。 文中说,如果多个进程都需要将数据添加到某一文件...
  • 所以我想问一下,有没有比较好的方法,能实现: 原子操作 start $id = $redis->get( 'comment:totalNum' ); $tableName = getTableName( $id ); $sql = "insert xxx"; $res = $db->mysql_query( 'sql' ); if( $res ...
  • 数据库事务的原子性:事务内的一组操作全部成功(或者全部失败) ...redis命令原子性:单命令操作的不可以再分,操作要么执行,要么不执行 实现方式:单线程 Java内存模型的原子性:在一个操作中就是cpu不可以在...
  • php实现含有redis命令原子操作在做一个爬虫,其中有一部分是评论数据。因为评论数太多,所以想要将爬取下来的评论进行分表。目前的思路是:每个表保存100万条数据(1-1000000保存在table1,1000001-2000000保存在...
  • 1、bootz 命令 启动Linux 系统 要启动 Linux,需要先将 Linux 镜像文件拷贝到 DRAM 中, 可以从 EMMC 或者 NAND 等存储设备中将 Linux 镜像和设备树文件拷贝到 DRAM,也可以通过 nfs 或者 tftp 将 Linux 镜像文件和...
  • 1.redis中的每个单独的命令都是原子性的,在期每个命令单独执行的过程中不用考录并发的问题。2.对于redis,处于同一事物中的一组命令的执行也是原子性的,同样是这组命令执行过程中不用考虑并发的问题。下面对于这两...
  • 正点原子-imx6ul学习笔记(6)- 命令 5:测试 命令集 1、先清除前面安装过的驱动 depmod 先清除前面安装过的驱动 2、 lsmod 查看加载成功的驱动。 modprobe .ko 安装.ko 文件 。 3、 ls /dev 3、查看设备号 cat /...
  • 0:1 代表的是 查看SD 卡的第一个分区 3.fatls 命令用于查询 FAT 格式设备的目录和文件信息 从上图可以看出,emmc 的分区 1 中存放着两个文件:zimage 和 imx6ull-14x14-evk.dtb,这 两个文件分别是 linux 镜像文件...
  • 代码如下: /** * redis相关的操作助手 */ @SuppressWarnings("SpellCheckingInspection") public class RedisHelper { private static CommonLog log = ... * SetNx luava脚本原子命令,Redis分布式锁setnx后set
  • 原子操作

    2019-10-12 13:01:01
    原子操作取“原子”的“不可拆分”的意思,原子操作是最小的执行单位,不会在执行的过程中被其它命令插入打断。
  • 1、有时候要保护的共享资源是一个简单的变量,可以通过架构相关的原子命令来实现互斥 2、atomic_t的定义 typedef struct {  int counter; } 3、在Linux系统中,atomic_打头的是原子操作函数,这些...
  • java原子类本质上使用的是CAS,而CAS底层是通过Unsafe类实现的。所以本章将对CAS, Unsafe和原子类详解。@pdai带着BAT大厂的面试问题去理解请带着这些问题继续后文,会很大程度上帮助你更好的理解相关知识点。@pdai...
  • RPOPLPUSH命令是一个原子命令,在一个原子时间内,会执行以下两个动作(都执行成功或者都执行失败): 将列表source中的表尾元素弹出,并返回给客户端。 将列表source弹出的表尾元素插入到列表destination的表头...
  • 原子操作(原子性) 所谓的原子操作是指不会被线程的调度机制所打断的操作;...tips:Redis单命令原子性主要得益于Redis的单线程 在多线程中,不能被其他进程或线程打断的操作就叫原子操作 ...
  • 正点原子Linux开发板2)摘自《正点原子I.MX6U嵌入式Linux驱动开发指南》关注官方微信号公众号,获取更多资料:正点原子第三十一章U-Boot顶层Makefile详解上一章我们详细的讲解了uboot的使用方法,其实就是各种命令的...
  • 在学习Redis的常用操作时,经常看到介绍说,Redis的set、get以及hset等等命令的执行都是原子性的,但是令自己百思不得其解的是,为什么这些操作是原子性的?原子原子性是数据库的事务中的特性。在数据库事务的情景...
  • Redis是一个开源的使用ANSI C语言编写、支持网络、可基于内存亦可持久化的日志型、Key-Value数据库,并提供多种语言的API...对于Redis而言,命令原子性指的是:一个操作的不可以再分,操作要么执行,要么不执行。...
  • 在学习Redis的常用操作时,经常看到介绍说,Redis的set、get以及hset等等命令的执行都是原子性的,但是令自己百思不得其解的是,为什么这些操作是原子性的?原子原子性是数据库的事务中的特性。在数据库事务的情景...
  • 对于Redis而言,命令原子性指的是: 一个操作的不可以再分,操作要么执行,要么不执行。 Redis的操作之所以是原子性的,是因为Redis是单线程的。 Redis本身提供的所有API都是原子操作, Redis中的事务其实是要保证...
  • 在学习Redis的常用操作时,经常看到介绍说,Redis的set、get以及hset等等命令的执行都是原子性的,但是令自己百思不得其解的是,为什么这些操作是原子性的?原子原子性是数据库的事务中的特性。在数据库事务的情景...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 2,902
精华内容 1,160
关键字:

原子命令