精华内容
下载资源
问答
  • OpenSees Parallel仿真软件,并行处理版,版本2.5.0,可运行在win32和win64
  • mupen64plus-libretro 要启用dynarec CPU内核,必须传递WITH_DYNAREC值以进行以下操作: 使WITH_DYNAREC = x86 使WITH_DYNAREC = x86_64 使WITH_DYNAREC =手臂 使WITH_DYNAREC = aarch64 新的制作选项: USE_C...
  • OpenSees Parallel2.5.0用到的mpich包,可运行在win32和win64
  • 目标是使用Vulkan计算尽可能准确地实现Nintendo 64 RDP图形芯片。 该实现的目标是在可能的情况下使用参考渲染器进行精确定位。 免责声明 尽管paraLLEl-RDP使用作为实现参考,但它不是该项目的端口,也不是该项目的...
  • mupen64plus-video-parallel Themaister的Vulkan RDP模拟器在OGL 3.3上的基本实现。 经过数天与GCC的交涉和一些杂项制作而成。 资料来源。 使用MSYS2进行编译 仅克隆/分叉Github存储库。 在“ unix”目录中,...
  • Parallel使用

    2018-10-01 20:59:12
    Parallel的静态For,ForEach和Invoke方法 Parallel是对Task的封装,目的是简化一些常见的编程情形中任务Task的使用,它内部使用Task。 以上三者的编程情形: Parallel.For(0,1000,i=>DoWork(i));//指定某个...

    Parallel的静态For,ForEach和Invoke方法
    Parallel是对Task的封装,目的是简化一些常见的编程情形中任务Task的使用,它内部使用Task。
    以上三者的编程情形:
    Parallel.For(0,1000,i=>DoWork(i));//指定某个操作的执行次数
    Parallel.ForEach(collection,item=>DoWork(item));//利用集合collection中的每一项item执行并发操作。
    Parallel.Invoke(
    ()=>Method1(),
    ()=>Method2(),
    ()=>Method3());//并发执行一些方法

    注意:
    1.如果任何操作抛出未处理的异常,Parallel方法最后会抛出一个AggregateException
    2.并发的前提条件:
    1)工作项必须能并行之行
    2)避免过多的资源争用,会导致上下文切换过于频繁和锁争用问题。
    3.Parellel本身有开销,所以如果并发执行的每一项都能很快执行,那么不应该使用并发执行。
    应用并发的场景:
    1)IO限制
    计算不复杂,但是需要等待操作完成,如访问数据库等耗时较长的操作就是IO限制。
    2)计算限制
    计算过于复杂,执行计算的线程需要耗很长时间才能结束计算。如果等待这个线程完成再执行别的操作,那么可能等很长时间

    ???那么采集点数较少时使用同步,采集点数过多时使用异步这个属于哪个限制导致的多线程问题??
    
    ParallelOptions
    Parallel的静态For,ForEach和Invoke方法都提供了接受一个ParallelOptions对象的重载版本。
    public class ParallelOptions{
    	public ParallelOptions();
    	public CancellationToken cancellationToken{get;set;}//取消操作,默认为CancellationToken.None
    	public Int32 MaxDegreeOfParallelism{get;set;}//允许指定可以并发操作的最大工作项数目,默认为-1(可用CPU数)
    	public TaskScheduler TaskScheduler{get;set;}//使用哪个TaskScheduler,默认为TaskScheduler.Default
    }
    
    For,ForEach的三个操作的重载版本
    任务局部初始化委托(localInit),为参与工作的每个任务都调用一次该委托。这个委托时在任务被要求出来一个工作项之前调用的。
    主体委托(body),为参与工作的各个线程所处理的每一项都调用一次该委托
    任务局部终结委托(localFinally),为参与工作的每一个任务都调用一次该委托。这个委托是在任务处理好派发给它的所有工作项之后调用的。即时主体委托代码引发一个未处理的异常,也会调用它。
    此调用的参数较复杂,具体参见MSDN
    
    ParallelLoopState对象
    	参与工作的每个任务都获得它自己的ParallelLoopState对象,并可通过这个对象和参与工作的其他任务进行交互。
    public class ParallelLoopState{
    	public void Stop();//告诉循环停止处理任何更多的工作
    	public Boolean IsStopped{get;}
    
    	public void Break();//告诉循环不再处理当前项之后的项
    	public Int64? LowestBreakIteration{get;}
    
    	public Boolean IsExceptional{get;}
    	public Boolean ShouldExitCurrentIteration{get;}//是否可以提前退出
    }
    
    ParallelLoopResult对象
    Parallel的静态For,ForEach方法都返回一个ParallelLoopResult实例
    public struct ParallelLoopResult
    {
    	//如果操作提前终止,以下方法返回false
    	public Boolean IsCompleted{get;}
    	public Int64? LowestBreakIteration{get;}
    }
    
    展开全文
  • 2021-07-20 M1版本mac Parallel16.5.1安装kali Parallel Tools

    如果不安装Parallel Tools没办法在物理机和虚拟机之间复制粘贴以及传输文件,所以为了使用方便,是必须安装的。目前没搜到m1系统相关的安装教程,我在安装过程中也踩了不少坑,这里记录一下正确的流程步骤,以备使用

    系统环境

    • MacBook Pro (13-inch, M1, 2020) macOS Big Sur 11.4
    • Parallels 16.5.1
    • kali-linux-2021.2-installer-arm64

    解决./install无反应

    首先右键选择kali虚拟机图标,选择安装Parallels Tools,会挂载磁盘
    将挂载parallels tools并移动到桌面:

    cp -R /media/cdrom0/ ~/Desktop/pdtools/
    

    安装

    sudo ./install
    

    这个时候会毫无反应,下面来进行修改
    解压kmods里面的压缩包,并删除之前的压缩包(如果想要原文件直接去/media/cdrom0里面拖出来):

    tar -xzf ./kmods/prl_mod.tar.gz
    rm ./kmods/prl_mod.tar.gz
    

    修改prl_fs/SharedFolders/Guest/Linux/prl_fs/inode.c,在最上面加上下面这行:

    #define segment_eq(a, b) ((a).seg == (b).seg)
    

    修改prl_fs_freeze/Snapshot/Guest/Linux/prl_freeze/prl_fs_freeze.c,在最上面加上下面这行:

    #include <linux/blkdev.h>
    

    然后重新打包:

    tar -zcvf ./kmods/prl_mod.tar.gz . dkms.conf Makefile.kmods
    

    此时sudo ./install可以开始安装了

    解决依赖问题

    安装过程中爆错,提示缺少三个环境,解决办法如下:

    # 更新源
    apt update
    
    # 安装内核头
    apt install linux-headers-$(uname -r)
    

    如果顺利安装就结束了,但是我这边安装提示找不到,所以需要我们手动去安装,点这里
    在这里插入图片描述
    ctrl+f搜索你的linux-headers-$(uname -r)输出内容即可,还有个common记得也要下载

    # 下载保存为 headers.deb
    wget -O headers.deb http://old.kali.org/kali/pool/main/l/linux/linux-headers-5.10.0-kali7-arm64_5.10.28-1kali1_arm64.deb
    
    # 下载对应内核头依赖保存为 common.deb
    wget -O common.deb http://old.kali.org/kali/pool/main/l/linux/linux-headers-5.10.0-kali7-common_5.10.28-1kali1_all.deb
    
    # 安装辅助 deb 安装工具
    apt install gdebi -y
    
    # 先安装 common 内核头依赖
    gdebi common.deb
    
    # 再安装主角 内核头文件
    gdebi headers.deb
    
    # 验证是否安装成功 (这个时候应该提示已经安装成功了)
    apt install linux-headers-$(uname -r)
    

    解决白屏问题

    默认的 xfce 环境成功安装 Parallels Tools 的话,重启后应该会白屏的异常情况,所以我们得手动安装切换成经典的 GNOME 桌面环境然后再安装 pd tools:

    apt install kali-desktop-gnome -y 
    

    在这里插入图片描述
    安装需要等待一会儿,完成后重启虚拟机。

    现在内核头和桌面环境都安装配置好后,回到之前的目录,再次运行sudo ./install即可
    在这里插入图片描述
    搞定

    参考链接

    • https://zhuanlan.zhihu.com/p/340544345
    • https://www.sqlsec.com/2021/04/pdtools.html
    展开全文
  • GNU Parallel

    千次阅读 2014-08-11 20:01:38
    GNU Parallel 它是什么? 指南 预备 parallel >= version 20130814 abc-file def-file abc0-file abc_-file tsv_file.tsv num30000 num1000000 num_%header 远程执行:ssh免密码登录$SERVER1和$SERVER2...
     
    

    GNU Parallel

    它是什么?

    GNU Parallel是一个shell工具,为了在一台或多台计算机上并行的执行计算任务,一个计算任务可以是一条shell命令或者一个以每一行做为输入的脚本程序。通常的输入是文件列表、主机列表、用户列表、URL列表或者表格列表;一个计算任务也可以是一个从管道读取的一条命令。GNU Parallel会把输入分块,然后通过管道并行的执行。

    如果你会使用xargs和tee命令,你会发现GNU Parallel非常易于使用,因为GNU Parallel具有与xargs一样的选项。GNU Parallel可以替代大部分的shell循环,并且用并行的方式更快的完成计算任务。

    GNU Parallel保证它的输出与顺序执行计算任务时是一样的,这样就可以方便的把GNU Parallel的输出做为其它程序的输入。

    对于每一行输入,GNU Parallel会把这一行做为参数来运行指定的命令。如果没有给出命令,那么这一行会被当做命令执行。多行输入会并行的运行。GNU Parallel经常被用于替代xargs或者cat | bash。

    指南

    本教程展示了绝大多数GNU Parallel的功能。旨在介绍GNU Parallel中的一个选项,而非讲解真实世界中使用的例子。花一个小时的时间学习本教程,你会由此爱上上命令行。

    预备

    为了执行本教程中的示例,你首先需要做如下准备:

    parallel >= version 20130814

    安装最新版:

    1 (wget -O - pi.dk/3 || curl pi.dk/3/) | bash

    这条命令同时也会安装最新版的指南

    1 man parallel_tutorial

    本教程的大部分内容同时也兼容旧版本。

    abc-file

    生成文件:

    1 parallel -k echo ::: A B C > abc-file

    def-file

    生成文件:

    1 parallel -k echo ::: D E F > def-file

    abc0-file

    生成文件:

    1 perl -e 'printf "A\0B\0C\0"' > abc0-file

    abc_-file

    生成文件:

    1 perl -e 'printf "A_B_C_"' > abc_-file

    tsv_file.tsv

    生成文件:

    1 perl -e 'printf "f1\tf2\nA\tB\nC\tD\n"' > tsv-file.tsv

    num30000

    生成文件:

    1 perl -e 'for(1..30000){print "$_\n"}' > num30000

    num1000000

    生成文件:

    1 perl -e 'for(1..1000000){print "$_\n"}' > num1000000

    num_%header

    生成文件:

    1 (echo %head1; echo %head2; perl -e 'for(1..10){print "$_\n"}') > num_%header

    远程执行:ssh免密码登录$SERVER1和$SERVER2

    生成文件:

    1 SERVER1=server.example.com
    2 SERVER2=server2.example.net

    最后应该成功运行如下命令:

    1 ssh $SERVER1 echo works
    2 ssh $SERVER2 echo works

    使用 ssh-keygen -t dsa; ssh-copy-id $SERVER1 建立环境(使用empty pass phrase)

    输入源

    GNU Parallel的输入源支持文件、命令行和标准输入(stdin或pipe)

    单个输入源

    从命令行读取输入:

    1 parallel echo ::: A B C

    输出(由于任务以并行的方式执行,顺序可能会有所不同):

    1 A
    2 B
    3 C

    文件做为输入源:

    1 parallel -a abc-file echo

    输出同上。

    STDIN(标准输入)做为输入源:

    1 cat abc-file | parallel echo

    输出同上。

    多输入源

    GNU Parallel支持通过命令行指定多个输入源,它会生成所有的组合:

    1 parallel echo ::: A B C ::: D E F

    输出:

    1 A D
    2 A E
    3 A F
    4 B D
    5 B E
    6 B F
    7 C D
    8 C E
    9 C F

    多个文件做为输入源:

    1 parallel -a abc-file -a def-file echo

    输出同上。

    STDIN(标准输入)可以做为输入源中的一个,使用“-”:

    1 cat abc-file | parallel -a - -a def-file echo

    输出同上。

    可以使用“::::”替代 -a:

    1 cat abc-file | parallel echo :::: - def-file

    输出同上。

    ::: 和 :::: 可以混合使用:

    1 parallel echo ::: A B C :::: def-file

    输出同上。

    适配参数

    –xapply 从每一个输入源取一个参数:

    1 parallel --xapply echo ::: A B C ::: D E F

    输出:

    1 A D
    2 B E
    3 C F

    如果其中一个输入源的长度比较短,它的值会被重复:

    1 parallel --xapply echo ::: A B C D E ::: F G

    输出:

    1 A F
    2 B G
    3 C F
    4 D G
    5 E F

    改变参数分隔符

    GNU Parallel可以指定分隔符替代 ::: 或 ::::,当这两个符号被其它命令占用的时候会特别有用:

    1 parallel --arg-sep ,, echo ,, A B C :::: def-file

    输出:

    1 A D
    2 A E
    3 A F
    4 B D
    5 B E
    6 B F
    7 C D
    8 C E
    9 C F

    改变参数分隔符:

    1 parallel --arg-file-sep // echo ::: A B C // def-file

    输出同上。

    改变参数定界符

    GNU Parallel默认把一行做为一个参数:使用 \n 做为参数定界符。可以使用 -d 改变:

    1 parallel -d _ echo :::: abc_-file

    输出:

    1 A
    2 B
    3 C

    \0 代表NULL:

    1 parallel -d '\0' echo :::: abc0-file

    输出同上。 
    -0 是 -d '\0' 的简写(通常用于从 find … -print0读取输入):

    1 parallel -0 echo :::: abc0-file

    输出同上。

    输入源中的结束值

    GNU Parallel支持指定一个值做为结束标志:

    1 parallel -E stop echo ::: A B stop C D

    输出:

    1 A
    2 B

    跳过空行

    使用 –no-run-if-empty 来跳过空行:

    1 (echo 1; echoecho 2) | parallel --no-run-if-empty echo

    输出:

    1 1
    2 2

    构建命令行

    没有指定命令意味着参数就是命令

    如果parallel之后没有给定命令,那么这些参数会被当做命令:

    1 parallel ::: ls 'echo foo' pwd

    输出:

    1 [当前文件列表]
    2 foo
    3 [当前工作目录的路径]

    命令可以是一个脚本文件,一个二进制可执行文件或一个bash的函数(须用 export -f 导出函数):

    1 # Only works in Bash and only if $SHELL=.../bash
    2 my_func() {
    3   echo in my_func $1
    4 }
    5 export -f my_func
    6 parallel my_func ::: 1 2 3

    输出:

    1 in my_func 1
    2 in my_func 2
    3 in my_func 3

    替换字符串

    5种替换字符串

    GNU Parallel支持多种替换字符串。默认使用 {}:

    1 parallel echo ::: A/B.C

    输出:

    1 A/B.C

    指定 {} :

    1 parallel echo {} ::: A/B.C

    输出同上 
    去掉扩展名 {.}:

    1 parallel echo {.} ::: A/B.C

    输出

    1 A/B

    去掉路径 {/}:

    1 parallel echo {/} ::: A/B.C

    输出:

    1 B.C

    只保留路径 {//}:

    1 parallel echo {//} ::: A/B.C

    输出:

    1 A

    去掉路径和扩展名 {/.}:

    1 parallel echo {/.} ::: A/B.C

    输出:

    1 B

    输出任务编号:

    1 parallel echo {#} ::: A/B.C

    输出:

    1 1
    2 2
    3 3

    改变替换字符串

    使用 -I 改变替换字符串符号 {}:

    1 parallel -I ,, echo ,, ::: A/B.C

    输出:

    1 A/B.C

    –extensionreplace替换 {.}:

    1 parallel --extensionreplace ,, echo ,, ::: A/B.C

    输出:

    1 A/B

    –basenamereplace替换 {/}:

    1 parallel --basenamereplace ,, echo ,, ::: A/B.C

    输出:

    1 B.C

    –dirnamereplace替换 {//}:

    1 parallel --dirnamereplace ,, echo ,, ::: A/B.C

    输出:

    1 A

    –basenameextensionreplace替换 {/.}:

    1 parallel --basenameextensionreplace ,, echo ,, ::: A/B.C

    输出:

    1 B

    –seqreplace替换 {#}:

    1 parallel --seqreplace ,, echo ,, ::: A B C

    输出:

    1 1
    2 2
    3 3

    指定位置替换字符串

    如果有多个输入源时,可以通过 {编号} 指定某一个输入源的参数:

    1 parallel echo {1} and {2} ::: A B ::: C D

    输出:

    1 A and C
    2 A and D
    3 B and C
    4 B and D

    可以使用 / // /. 和 .: 改变指定替换字符串:

    1 parallel echo /={1/} //={1//} /.={1/.} .={1.} ::: A/B.C D/E.F

    输出:

    1 /=B.C //=A /.=B .=A/B
    2 /=E.F //=D /.=E .=D/E

    位置可以是负数,表示倒着数:

    1 parallel echo 1={1} 2={2} 3={3} -1={-1} -2={-2} -3={-3} ::: A B ::: C D ::: E F

    输出:

    1 1=A 2=C 3=E -1=E -2=C -3=A
    2 1=A 2=C 3=F -1=F -2=C -3=A
    3 1=A 2=D 3=E -1=E -2=D -3=A
    4 1=A 2=D 3=F -1=F -2=D -3=A
    5 1=B 2=C 3=E -1=E -2=C -3=B
    6 1=B 2=C 3=F -1=F -2=C -3=B
    7 1=B 2=D 3=E -1=E -2=D -3=B
    8 1=B 2=D 3=F -1=F -2=D -3=B

    按列输入

    使用 –colsep 把文件中的行切分为列,做为输入参数。下面使用TAB(\t):

    1 1=f1 2=f2
    2 1=A 2=B
    3 1=C 2=D

    指定参数名

    使用 –header 把每一行输入中的第一个值做为参数名:

    1 parallel --header : echo f1={f1} f2={f2} ::: f1 A B ::: f2 C D

    输出:

    1 f1=A f2=C
    2 f1=A f2=D
    3 f1=B f2=C
    4 f1=B f2=D

    使用 –colsep 处理使用TAB做为分隔符的文件:

    1 parallel --header : --colsep '\t' echo f1={f1} f2={f2} :::: tsv-file.tsv

    输出:

    1 f1=A f2=B
    2 f1=C f2=D

    多参数

    –xargs 让GNU Parallel支持一行多个参数(可以指定上限):

    1 cat num30000 | parallel --xargs echo wc -l

    输出:

    1 2

    30000个参数被分为两行。 
    一行中的参数个数的上限通过 -s 指定。下面指定最大长度是10000,会被分为17行:

    1 cat num30000 | parallel --xargs -s 10000 echo wc -l

    输出:

    1  

    为了获得更好的并发性,GNU Parallel会在文件读取结束后再分发参数。

    GNU Parallel 在读取完最后一个参数之后,才开始第二个任务,此时会把所有的参数平均分配到4个任务(如果指定了4个任务)。

    第一个任务与上面使用 –xargs 的例子一样,但是第二个任务会被平均的分成4个任务,最终一共5个任务。

    1 cat num30000 | parallel --jobs 4 -m echo wc -l

    输出:

    1 5

    10分参数分配到4个任务可以看得更清晰:

    1 parallel --jobs 4 -m echo ::: {1..10}

    输出:

    1 1 2 3
    2 4 5 6
    3 7 8 9
    4 10

    替换字符串可以是单词的一部分。通过下面两个命令体会 -m 和 -X 的区别:

    1 parallel --jobs 4 -m echo pre-{}-post ::: A B C D E F G

    输出:

    1 pre-A B-post
    2 pre-C D-post
    3 pre-E F-post
    4 pre-G-post

    -X与 -m 相反:

    1 parallel --jobs 4 -X echo pre-{}-post ::: A B C D E F G

    输出:

    1 pre-A-post pre-B-post
    2 pre-C-post pre-D-post
    3 pre-E-post pre-F-post
    4 pre-G-post

    使用 -N 限制每行参数的个数:

    1 parallel -N3 echo ::: A B C D E F G H

    输出:

    1 A B C
    2 D E F
    3 G H

    -N也可以用于指定位置替换字符串:

    1 parallel -N3 echo 1={1} 2={2} 3={3} ::: A B C D E F G H

    输出:

    1 1=A 2=B 3=C
    2 1=D 2=E 3=F
    3 1=G 2=H 3=

    -N0 只读取一个参数,但不附加:

    1 parallel -N0 echo foo ::: 1 2 3

    输出:

    1 foo
    2 foo
    3 foo

    引用

    如果命令行中包含特殊字符,就需要使用引号保护起来。

    perl脚本 'print “@ARGV\n”' 与linux的 echo 的功能一样。

    1 perl -e 'print "@ARGV\n"' A

    输出:

    1 A

    使用GNU Parallel运行这条命令的时候,perl命令需要用引号包起来:

    1 parallel perl -e 'print "@ARGV\n"' ::: This wont work

    输出:

    1 [Nothing]

    使用 -q 保护perl命令:

    1 parallel -q perl -e 'print "@ARGV\n"' ::: This works

    输出:

    1 This
    2 works

    也可以使用 ' :

    1 parallel perl -e \''print "@ARGV\n"'\' ::: This works, too

    输出:

    1 This
    2 works,
    3 too

    使用 -quote:

    1 parallel --shellquote
    2 parallel: Warning: Input is read from the terminal. Only experts do this on purpose. Press CTRL-D to exit.
    3 perl -e 'print "@ARGV\n"'
    4 [CTRL-D]

    输出:

    1 perl\ -e\ \'print\ \"@ARGV\\n\"\'

    也可以使用命令:

    1 parallel perl\ -e\ \'print\ \"@ARGV\\n\"\' ::: This also works

    输出:

    1 This
    2 also
    3 works

    去除空格

    使用 –trim 去除参数两头的空格:

    1 parallel --trim r echo pre-{}-post ::: ' A '

    输出: