两者不是同样的功能.
而且, DMA保序的意义是: 在前面的DMA完成之前, 不会执行后面的DMA. 可以用athread_dma_barrier()
实现或者是使用mode为DMA_BARRIER
的dma原语.
athread_syn
是从核之间同步, 在所有参与同步的从核进入athread_syn
之前, 不会执行下面的指令.
swmore 发布的帖子
-
RE: 请问dma_barrier如何使用呢?
-
一个End-to-End的swgdb包装
import os import sys import re def print_help(): print 'Eaiser way to launch swgdb' print 'Usage: easiergdb.py jobid rank' def check(exe): ret = os.wait() code = ret[1] >> 8 if code: print '%s exited with code %d' % (exe, code) exit(1) try: jobid = int(sys.argv[1]) rank = int(sys.argv[2]) except Exception: print_help() exit(1) bdebug = os.popen('bdebug %d' % jobid) check('bdebug') bjobs = os.popen('bjobs -l %d' % jobid) check('bjobs') bjobs_output = bjobs.read() cmd_re = re.compile('Command<(?P<CMD>[^>]*)>') cwd_re = re.compile('CWD<(?P<CWD>[^>]*)>') cmd = cmd_re.search(bjobs_output).groupdict()['CMD'] cwd = cwd_re.search(bjobs_output).groupdict()['CWD'] exe = cmd.split(' ')[0] bjobinfo = os.popen('bjobinfo %d' % jobid) check('bjobinfo') node = '0' bjobinfo_lines = bjobinfo.read().split('\n') spaces = re.compile('\\s*') for line in bjobinfo_lines[4:-2]: r = spaces.split(line)[1] if int(r) == rank: node = spaces.split(line)[4] print '==========================================' print 'Target pid is %s' % spaces.split(line)[6] print '==========================================' if os.path.exists(cwd + os.path.sep + exe): path = cwd + os.path.sep + exe else: path = exe os.system("sed -e 's/gdbtui/gdb/g' `which swgdb`> /tmp/swgdb.%d" % os.getpid()) os.system('sh /tmp/swgdb.%d %s %s' % (os.getpid(), path, node)) os.system('rm /tmp/swgdb.%d' % (os.getpid()))
这是一个用上去可能更简单的一点的包装。
用法是python xxx.py 作业号 进程号。
xxx.py是上面这段代码保存的路径。 -
RE: 采用统计方法在大规模调试中寻找死掉的进程
我再插一嘴。
BBS那么凉,相当大程度上是因为大家比较喜欢怼到脸上来问。
这样其实不好。
想想在X86上编程,基本上有问题就StackOverflow,而我们遇到问题,一个自己搜一下解决的地方都没有。
所以我还是墙裂建议大家把问题po到BBS上来。
哪怕贴脸问了得到了答案分享一下也可以。
另外,我遇到了另一个问题,今天帮阿廖调CAM的时候发现有两个进程直接没了。
用bpeek <jobid> | grep -o -E 'Myid = [0-9]*' | awk '{print $3}' | sort | awk 'BEGIN{last=-1}{if ($1 > last +1) print $1; last = $1}
可以找到中间缺了哪个进程(打出来的是它的上一个进程丢掉了)。 -
RE: 中断怎么使用
经过我一系列的尝试, 写不出能用的例子来.
感觉信号系统有毒.
另外, expt_signal可以用, 但是主核收到了处理完就要退出T_T.
用H2LDM或者IO_addr配合忙等吧. -
RE: 请问DMA模式中RANK_MODE行集合模式是什么呢?
大概应该是
athread_get(RANK_MODE, src, dst, len, &reply, mask, stride, bsize)
比如athread_get(RANK_MODE, src, dst, 1024, &reply, 0xff, 0, 32)
应该是: len=1024, mask=0xff, bsize=32
可以获取1024B数据,其中从核0获得0-32B, 256-288B, 512-544B, 768-800B, 从核1获得32-63B, 288-320B, 544-576B, 800-832B, 以此类推。例子:
#ifdef MPE #include <athread.h> #include <stdio.h> extern SLAVE_FUN(rank_mode)(double *); int main(){ double data[128]; int i; for (i = 0; i < 128; i ++){ data[i] = i; } athread_init(); athread_spawn(rank_mode, data); athread_join(); athread_halt(); } #endif #ifdef CPE #include <slave.h> void rank_mode(double *data){ if (_ROW > 0) return; double d_local[16]; volatile int reply; athread_syn(ROW_SCOPE, 0xff); if (_COL == 0){ reply = 0; athread_get(RANK_MODE, data, d_local, 1024, &reply, 0xff, 0, 32); while (reply != 1); } athread_syn(ROW_SCOPE, 0xff); int i; for (i = 0; i < 8; i ++){ athread_syn(ROW_SCOPE, 0xff); if (_COL == i){ printf("%d:", _COL); int j; for (j = 0; j < 16; j ++){ printf("%f ", d_local[j]); } puts(""); } } } #endif