- 博客(50)
- 资源 (9)
- 收藏
- 关注
原创 安装nvidia driver出错,需要内核模块签名(signed kernel module)的解决过程
有一段时间没写博客了,今天遇到的问题耗费了很多精力,需要记录一下。同样问题的完整解决过程,我没有在google上搜到。 安装nvidia driver,会有build kernel module的过程,安装kernel-devel包之后,正常的安装步骤略去不表,一般情况下,一路确定下去基本不会有问题。如果内核编译时,选择加载模块强制需要签名,就会碰到下面的问题,war
2014-01-21 19:28:12
2681
原创 x86平台上sse intrinsic中的操作数类型
一个同事的问题,让我澄清了很久以来对sse intrinsic 中的比如 __m128、__m128d 等类型的操作数的误解,所以在此记下来。intrinsic 的写法都在手册上,这里就不抄了……比如一个双精度向量乘法的intrinsic:__m128d _mm_mul_pd ( __m128d a, __m128d b ) ,我一直以为这里的 __m128d 类型必须是单个变量(
2013-05-17 18:41:24
558
原创 非规则浮点数(subnormal)引起浮点运算变慢
1. 非规则浮点数(subnormal) 根据IEEE754(http://zh.wikipedia.org/wiki/IEEE_754),浮点数由符号位、指数、尾数组成,对8字节的double 类型数据,指数位有11位,可以表示2的阶数范围 -1022~+1023,对应的指数部分的值是1~2046(加上1023的偏移)。 double类型的尾数位有52位,
2013-04-16 18:40:46
2279
原创 Intel Transactional Synchronization Extension (TSX) 事务性同步扩展
这是一份Intel IDF2013上的讲座笔记。TSX是新一代Haswell架构上,通过硬件支持的事务性内存(Transactional Memory)解决方案。1. 动机一句话概括Intel的事务性同步扩展(Transactional Synchronization Extension, TSX)的动机:粗粒度锁保证的事务性操作,在高并发下性能下降,作为细粒度锁方案的一种替代,
2013-04-11 14:34:46
1479
原创 拷贝或者迁移openmpi
很多时候你会想要把一台机器上已经安装的openmpi 工具拷到其他机器上直接用,而不必在每一台机器上都重新安装一次。如果保证目标机器的openmpi文件夹路径与安装源的一致,那么没有问题。如果想换一个文件夹,即使是在同一台机器上迁移,openmpi是跑不起来的,原因是二进制程序里hard code了安装时的prefix 路径。好在很早(1.2.1 版本以后)官方对这个就给了一个解决方案
2013-04-03 18:20:21
590
原创 C程序中简单获取机器的CPU物理核数和主频(Redhat Linux系统)
获取这两个参数,主要的目的是计算机器的理论浮点峰值。言归正传,问题有两个部分,一个是如何获取这两个值,另一个是怎么传递到C程序中。1. 获取(以下内容在非Redhat 系统上需要变通以下,不能用是正常的)先看一个cpuinfo的例子:$cat /proc/cpuinfoprocessor : 0vendor_id :GenuineIntelcpu family
2013-03-26 18:56:37
865
原创 关于函数的calling convention(调用规范)
最近做C和汇编的混合编译时,掉进的一个坑,记一笔。对于混合编程,最需要注意的地方是平台层面的ABI (application binary interface) 和语言层面的calling convention。这次的坑:caller是C语言函数,callee用汇编写的。C函数里的实参用的int型,汇编函数输入需要long型。在64位平台的汇编,要求INTEGER类型的参数
2013-02-20 19:27:08
623
原创 GotoBLAS2编译,与openmp兼容性的解决方案
编译配置在makefile.rule里,在较新的机器上,首先要设置target和位宽,比如:TARGET=NEHALEMBINARY=64然后,multi-threaded版本与openmp使用有潜在冲突:1. 首先,必须禁用gotoblas2的cpu affinity选项,即设置 NO_AFFINIY = 1 否则,编译出的libgoto2,能
2013-02-01 10:54:01
627
原创 GNU和Intel的debugger在使用方便性上的比较
GNU的调试器就是大名鼎鼎的gdb,Intel对应的产品是idbc,大体上命令和使用方法都是一样的,但是使用的方便性上,也就是调试时呈现的方式稍有不同。实际gdb也可以调试icc编译的程序,但是会丢失一些信息,使断点等的定位不准,多线程的调试不能进入并行区等,不推荐。idbc最让人不爽的一点,是使用list (l)命令显示源码,会从当前行的前几行开始,这样连续使用list 的话,打
2012-12-19 17:42:38
734
原创 一个简单的大坑,C语言整型常数的声明与乘法溢出
栽到一个简单的坑里了,怪自己基础不牢,网上查了下,中文的结果貌似没有写这个的,所以发出来。下面的代码,变量 i 的值是多少呢:#define P (64*1024)long long i = P * P;答案是 i 溢出了,暂时我看到结果 i = 0(当然这很有可能结果属于未定义)。解决的关键是,对于运算可能出现超出int范围的常数,一律声明为long,比如#define P
2012-10-25 15:37:17
3385
原创 非规格化浮点数(nan, inf, subnormal等)的判别和运算
大规模数学运算中有时会碰到结果为NaN的情况,由于NaN参与任何比较得到false(这点与inf不同!),将破坏正常的程序逻辑,又因为NaN同任何数做数学运算得到NaN,具有传递性,使得定位非常困难。NaN产生的最可能的原因是 0*inf ,大多数路径是这样的:1/subnormal = inf 或 1/0 = inf --> 0 * inf = nan下面的代码重
2012-10-12 19:32:36
1791
原创 scp 出现 protocol error: bad mode 错误的解决过程
刚碰到的一个诡异问题,两台配置完全相同的实验机,用scp传文件,出现“protocol error: bad mode”错误。一看基本超出我能处理的范围,首先求助google,大多数回复是基于字面的猜测,是不是TCP/IP等协议不匹配的问题。但是首先ssh登录没有问题,只是scp才出错,不太可能是真的协议问题;并且两台机器的软硬件配置是相同的,排除。直到某国外论坛上看到有一个回复是
2012-10-10 17:47:43
2710
1
原创 用汇编调试的方法窥探库函数的实现
这篇笔记的起因是我想要偷窥一下IntelMKL库中spmv的实现细节,有可能的话看是不是可以在汇编层面做一些优化的工作。需要分析的MKL库函数是:void mkl_scsrmv (char *transa, MKL_INT *m, MKL_INT *k, float *alpha, char *matdescra, float *val, MKL_INT *indx,MKL_INT *pntr
2012-09-10 16:03:51
879
原创 linux如何迁移用户账户
其实账户名和密码迁移很容易,老的系统加密密码在 /etc/passwd 中,较新的系统放在 /etc/shadow,另外加上用户组信息 /etc/group,共三个文件复制到新的系统上就完成了,立即生效,不用重启。较困难的工作是之后怎么建立每个用户的主目录,甚至迁移已有的目录和文件,这个网上可以找到脚本;另一个方法是把/home文件夹所在的文件系统做成nfs,直接挂上来,非常方便
2012-03-28 20:54:27
868
原创 如何控制Linux下多个Shell脚本串行执行
当你在一个类似批处理的脚本里启动多个shell脚本的时候,可能没有意识到shell背后的调度器会将这些脚本在多个CPU上并行执行。当同时执行的脚本访问某些共享资源(通常是文件)时,可能造成执行的结果错误,而且经常让你意识不到。不同于低级语言中提供同步等机制,shell提供的逻辑执行的机制可以用于串行化执行,例如:1.sh && 2.sh && [...]不过这种方法的一个问题是
2012-03-27 04:40:58
3513
原创 用Intel编译器做C和fortran混合编译的trick,关于for_main.o
上次写了GNU的一套编译器做C和fortran的混合编译问题,这次因为机器编译环境的问题,用了intel的编译器(icc/ifort/icc编译的mpi),使用C语言的主程序调用fortran的函数,同样的方法会遇到链接的问题:multiple definition of `main':/opt/intel/……/lib/intel64/for_main.c: first defi
2012-03-07 17:01:51
1138
原创 f77与gfortran在external symbol(外部符号)上的区别,注意下划线
今天先简单写一下,以后完善一篇C-fortran互相调用要注意的要点 ^_^!!!实验平台 CentOS 5.3如果.f文件中的函数名称都不含有下划线“_”,f77与gfortran编译出的.o文件中,导出的外部符号是相同的,可以用nm命令查看。例:add.fsubroutine add(a, b, sum)……$ f77 -c add.f$ nm add.o00
2012-02-13 05:19:49
737
原创 gcc的大坑,inline函数
为什么说inline函数是gcc的一个大坑呢?因为对inline的处理,它做了C99标准之外的东西,虽然更方便了,但是埋下了兼容性的隐患。我偶然想用icc编译以前的代码发现链接不能通过,引用一个inline函数提示未定义。网上有篇日志讲的很详细:GCC中的inline关键字 (
2011-07-12 23:00:48
793
原创 比较两个文件中行乱序的相同行与不同行
<br />为了check多线程程序的结果,经常需要比较行乱序的两个文件中的内容。起初的想法是用perl之类的处理一下,之后发现利用grep工具本身的功能就可以完成简单的工作。<br /> <br />输出相同行:<br />$grep -wf file1 file2<br /> <br />输出不同行:<br />$grep -wvf file1 file2<br /> <br />关键是grep的参数-f,可以从文件中取得pattern;-w指定必须匹配整个word;-v输出不匹配的行
2011-05-06 11:40:00
1423
原创 在shell里做浮点计算
<br />如果两个变量做基本的整数运算,在shell里是很容易实现的,只需(($a+$b))就可以;但是shell本身是不支持浮点计算的,不过我们可以用变通的方法——使用常用的计算器工具bc就可以实现浮点计算:<br /> <br />#! /bin/sh<br /> <br />sum=$(echo "$1+$2" | bc )<br />echo $sum<br /> <br />下一篇要写一写怎么从文件中提取数值赋值给变量(折腾了好久 Orz)
2011-04-29 22:46:00
824
转载 当while遇到重定向----sh的陷阱
<br />PS:我自己的系统里sh直接指向bash,估计不存在这个问题<br /> <br />以下是我在编程时的亲身体会:<br />先看如下的程序:<br />#!/bin/sh<br /><br />count=0<br />while read LINE<br />do<br />count=`expr $count + 1`<br />done < file<br />echo $count<br />问题是这个程序能得到什么样的结果?仿佛很明显,能够统计文件file的行数,然而你若执行一下便知
2011-04-29 20:55:00
539
原创 vim在xshell等终端下的配色方案,推荐darkburn
用过的都知道,xshell默认的配色下,vi的注释颜色非常不友好,其他配色也存在对比度低的问题。社区里有个名叫darkburn的配色方案,用过之后欲罢不能啊,如果结合 :set t_Co=256 (设为256色方案),用起来就更完美了。背景呈暗绿色,文字反白,很舒服。配色脚本下载:darkburn.vim ,安装方法页面上有讲。csdn不能上传附件,可惜了。 vim.org
2011-04-29 19:38:00
8691
原创 OpenMP笔记——打开编译报告
linux平台上使用 -openmp-report 2 打开完全的OMP编译报告,包括所有编译指导是否成功。如果使用级别1,报告loop,region,section的并行是否成功。
2011-04-28 18:54:00
559
原创 icc控制OpenMP并行线程数的方法
默认情况下,OpenMP并行线程数等于系统中CPU核数(超线程开启下X2),即 $cat /proc/cpuinfo 看到的core的个数 。如果你需要修改,一个方法是设置环境变量:$set OMP_NUM_THREADS=N并发线程的数量由icc自动处理。
2011-04-08 22:47:00
1765
转载 linux终止其他用户会话的方法
<br />或许你也遇到这种情况,在管理或者别的时候,需要将某些用户的会话强制关闭。一般大家可能熟知的方法是查找该用户会话的所有进程,然后kill掉。这种方法大部分情况下是可以工作的。但是,若在用户会话非正常退出时,就难以达到效果了。<br /><br />本文讲述两种方法,来删除指定用户的会话。均是可以在不知道用户进程号的情况下完成的,提高了工作效率。<br /><br />使用tty命令,查看本会话的会话号。不要将自己给kill掉了,那是日本人喜欢做的事,不是我们大汉民族的所作所为:<br /><br
2011-04-07 11:18:00
3057
转载 函数后const声明的含义
<br /> 类成员函数中const的使用 <br /> <br />一般放在函数体后,形如:void fun() const; <br />如果一个成员函数的不会修改数据成员,那么最好将其声明为const,因为const成员函数中不允许对数据成员进行修改,如果修改,编译器将报错,这大大提高了程序的健壮性。<br /> <br />原文可以参考:const在函数前与函数后的区别——http://apps.hi.baidu.com/share/detail/743
2011-04-02 11:06:00
454
转载 linux中的spinlock和mutex
<br /><br />内核同步措施<br /> 为了避免并发,防止竞争。内核提供了一组同步方法来提供对共享数据的保护。 我们的重点不是介绍这些方法的详细用法,而是强调为什么使用这些方法和它们之间的差别。<br /> Linux 使用的同步机制可以说从2.0到2.6以来不断发展完善。从最初的原子操作,到后来的信号量,从大内核锁到今天的自旋锁。这些同步机制的发展伴随 Linux从单处理器到对称多处理器的过度;伴随着从非抢占内核到抢占内核的过度。锁机制越来越有效,也越来越复杂。<br /> 目
2011-03-23 17:06:00
365
原创 screen,一个远程提交作业的工具,提交完成就可以断开连接
<br />用xshell登陆到远程机器上运行长作业的时候,如果xshell会话意外关闭(比如本地服务器重启了),作业会被终止,但是用screen环境运行的作业,在退出(deattach)screen之后,仍然在远程服务器运行,xshell可以关闭,笔记本可以拿走,并且以后可以通过screen重新连接到deattach之前的运行环境,很方便。下面是简单的使用方法:$ ssh remote_machineremote_machine $screen -S longjob // 创建窗口, -S 后
2011-03-17 19:24:00
1119
原创 linux使用openmp及math库的小问题
<br />有些小问题在初次使用的时候很烦,知道了就很容易。下面的麻烦事我自己碰到的,分享一下,大牛见笑。<br /> <br />gcc和g++本身包含openmp的支持,但是使用上有一点区别:gcc或者icc只需要添加-fopenmp编译即可使用,但是g++需要包含<omp.h>头文件以使用某些C风格的函数,比如omp_get_num_procs。<br /> <br />我使用的redhat enterprise 6 系统的math动态库 libm.so在默认链接路径下,但是如果使用-static静态
2011-03-16 19:02:00
1473
原创 thunderbird怎样方便的导入gmail联系人
<br /> 如果按一般的方法,先从gmail里选择通讯录导出为.cvs格式文件,再导入到thunderbird会遇到很多问题。首先gmail里的联系人信息名和姓(first name & last name)是分开的,在.cvs文件里记录在不同的栏中,导入到thunderbird不能显示名称;而且导入时需要手工指定gmail的栏目和thunderbird记录分类的映射关系,很麻烦。<br /> <br /> 这里可以用一个thunderbird的插件,名叫Zindus。安装后,在Zin
2011-03-11 17:15:00
2174
原创 __restrict__的作用
<br />读风辰大大的代码看到__restrict__,发现nvcc早就支持这个编译优化提示了,可是没看到哪本书讲过。<br />NV手册上说明与C99引入的restrict是相同特性,下面转自百度百科:<br /> <br />restrict是c99引入的,它只可以用于限定指针,并表明指针是访问一个数据对象的唯一且初始的方式.<br /> <br /> 考虑下面的例子: int ar[10]; int * restrict restar=(int *)malloc(10*sizeof(int))
2011-01-14 10:40:00
1751
转载 linux下Mercurial Hg的配置方法
这个工具在国内很少人使用,所以中文资料匮乏.只有官方的website上有一些少得可怜的中文资料了.不过总体上来说,hg还是比较好用的。这里绍一下hg服务器的配置。关于hg在基本用法参见mercrial的官方网站。在做以下操作时,请到 http://www.selenic.com/mercurial/下载安装hg.1.建立用户hgrepo其它用户将用这个账户用hg服务器push代码。useradd hgrepo -d /home/hgrepo # add user hgrepopasswd hgr
2010-11-05 14:50:00
2586
原创 结构体数据对齐
driver API中需要对function传递参数,本来这个是device端的对齐问题。但是当我想用结构体来传递参数时,想让结构体的对齐方式与device要求的一致,这时是主机端代码的问题了。如果认为device端数据都必须按照8byte对齐(其实不对齐也可以,不知道这个说法怎么来的),怎么做呢?查了一下,用 #pragma pack ([n])可以,或者:typedef struct kernel_args { int dummy; CUdeviceptr d_res;
2010-10-11 09:52:00
294
原创 检查文件依赖的动态链接库
<br />如果想要确认编译时链接的动态库是否正确(属于隐式调用),或者运行时是否加载了已安装的新库,这时可以用ldd命令。<br /> <br />语法很简单:ldd [file]<br /> <br />返回结果类似下面这样:<br /> libcufft.so.3 => /usr/local/cuda/lib64/libcufft.so.3 (0x00002ba67e3aa000)<br /> libcuda.so.1 => /usr/lib64/libcuda.so.1 (0x000
2010-09-28 10:00:00
894
原创 赋值带限定符时的规则
<br />带限定符const ,static 的赋值<br /> <br />1. 对于普通类型赋值: 规则很简单<br />2. 对于指针类型赋值: "="两边都是指针时,左边的指针必须具有右边指针的全部限定符(可以更多)。<br /> <br />有一点就是在程序里对常量和内建变量取地址操作 & 会得到 const 修饰的指针!!<br /> <br />更加详细的说明mark一下,希望页面不会失效:<br />http://www.cnblogs.com/chio/archive/2008/09/1
2010-09-27 09:44:00
267
原创 如何在CUDA driver API中解析error code
用惯了cutil中的CUDA_SAFE_CALL,在driver API下编程也有一个类似的叫 CU_SAFE_CALL,不过这里就有一个恼人的问题了:CU_SAFE_CALL在出错时打印的错误代码error code是以16进制显示的,程序员不好理解。看了cutil.h以后容易明白的,driver API返回的是CUresult类型错误码,而cuda runtime API返回cudaError_t,看过manual可以猜到二者实际是一样的,但是编译器不认识。如果我们想在driver API下得到CUDA
2010-09-21 18:50:00
1307
原创 内存设置的一些有用技巧
<br />向baoyg师兄学习,由衷敬佩。<br /> <br />一些有用的技巧<br />1 内核中获取模块变量的物理地址x86_64平台中,内核变量可以通过直接减一个固定偏移(START_KERNEL_map = 0xffffffff80000000)来获得物理地址;但是Module中的变量还是需要查询页表才能获得物理地址,可以通过调用lookup_address来获得对应的PTE<br />2 设置页面为Uncacheable有两种方法:<br />2.1 一种是使用MTRR。
2010-09-21 15:13:00
592
原创 CUdeviceptr的麻烦
用driver API写程序,在memalloc和memset时候老是编译通不过:cannot convert ?.nt**?.to ?.Udeviceptr*?.for argument ?.?.to ?.Uresult cuMemAlloc(CUdeviceptr*, unsigned int)?之类的错误。查了下cuda.h,发现CUdeviceptr是unsigned int 类型的,在64位机器上这就麻烦了。暂时没想出来怎么搞,待续。转一篇NV forum 关于这个的帖:I have a ques
2010-09-21 11:16:00
754
原创 CUDA的设备初始化
看别人的代码发现一点有意思的东西: // this is the standard trick for making sure the runtime has been initialized (so we can // borrow its context) cudaError_t cudares = cudaFree(0); if(cudares != cudaSuccess) return(-1);不太明白runtime的初始化是什么意思,暂且记下。趁机查文档系统看看初始化的操
2010-09-20 15:59:00
826
转载 传说中的fork炸弹
<br />百度知道上偶然看到的,记在这里:<br /> <br />.(){ .|.& };.<br /><br />死循环。执行这个SHELL会以2的指数次幂的速度不断产生新进程,这会导致系统资源会被迅速耗光,最终除非重新启动机器。<br /><br />1 .()<br />2 {<br />3.|.& <br />4 }<br />5 ;<br />6 .<br /><br />解释<br />第 1 行说明下面要定义一个函数,函数名为小数点,没有可选参数。 <b
2010-09-16 11:41:00
271
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人