这个博客不再更新。

我把这个博客的部分文章转移到了新博客,新博客是:http://codeand.me 

我现在使用的博客是: http://codeand.me       欢迎各位灌水订阅
posted @ 2010-09-24 03:04 头发抽筋 阅读(11) 评论(0) 编辑

在一个项目中用了另外一个项目的源文件中的变量,没有将用到的项目的源文件添加进自身项目。


...............

............

...........

posted @ 2010-03-30 19:56 头发抽筋 阅读(117) 评论(0) 编辑

 headerTable 是一个自定义的结构,发送和接受的时候用MPI_BYTE,并且在发送的时候讲变量转换成(void*)指针就可以用MPI函数发送自定义结构。


MPI_Send ( (void*)lht, sizeof ( headerTable ) * lhtCount, MPI_BYTE, j, 99, MPI_COMM_WORLD);

MPI_Recv ( tHT, sizeof ( headerTable ) * pNodeHT, MPI_BYTE, 0, 99, MPI_COMM_WORLD, &status );

posted @ 2010-03-30 14:27 头发抽筋 阅读(78) 评论(0) 编辑
我最近在写一个 Tcp的程序

服务端有两个send函数,每次发送两个数据到 Socket1 和 Socket2分别对应的客服端去。

...
send ( Socket1, buf, size, 0 );
send ( Socket2, buf, size, 0 );
...

客户端接收的代码


    timeval tm = {0, 0};      
    ret = select ( 0&fdread, NULL, NULL, &tm );
    
switch (ret)
    {
    
case 0:    // No data got.
        break;
    
case 1:// Get data.
        int iResult;
        iResult 
= recv ( ServerSocket, ( char* ) Zi, sizeof ( ZoneInfo ), 0 );
        
if ( iResult <= 0 )
        {
            exit(
1);
        }
        iResult 
= recv ( ServerSocket, ( char* ) ( Zi + 1 ), sizeof ( ZoneInfo ), 0 );
        
if ( iResult <= 0 )
        {
            exit(
1);
        }
        
break;
    
case SOCKET_ERROR:
        exit (
1);
        
break;

 

注:sizeof ( ZoneInfo )= 804

现在的问题是在多次运行 两个send函数以后,开始几次(次数不定)客服端接受正常,但后面几次send就会发生阻塞,客服端接受不到数据,不知道这个是什么原因。


后来我发现如果select的阻塞延迟是0的话就出现上述问题,如果阻塞设置一小段时间就正常,也可以在客服端用 Sleep(500) 来解决这个问题。

不过这是什么原因呢?绝对不是缓冲区阻塞吧。


还有个问题,windows窗口程序用recv函数的话不会像 控制台程序一样一直阻塞,好像只会阻塞个几秒就退出了,这个问题好像跟上面一个问题有关联。

posted @ 2010-03-28 12:16 头发抽筋 阅读(438) 评论(0) 编辑

LinuxMPI (Message Passage Interface) 的程序不太好调试,在windowsvs2005以上的IDE有集成的简便MPI调试工具,没有用过,有兴趣的可以试验一下。下面总结了一些最近在用MPIc语言写程序时的调试经验(Ubuntu环境,c语言, mpich 1.2.7)。

 

需要注意的几个小问题

在编译程序的时候 –g 是一定要加的,不然在gdb调试的时候可能会报类似“source is not available”的错误。开始我调程序的时候我都把我的程序的每个调试版本,分别发送到集群中的每台机器上面,然后在mpirun –machinefile host –np 3 myprogram 运行我的程序,这种方法没有效率,只能在最后记录实验结果的时候或者最后调试阶段才能用。有效率的方式是 mpirun –np 3 myprogram 在本机直接运行程序,这样mpi就会在本机开3myprogram的进程,这样不接网线都可以方便的调试mpi的程序。这是几个小问题,下面切入关键部分。

 

gdb来调试mpi的程序

首先,本文所用的mpich版本为1.2.7,可能跟其他版本有一定的差异,RTFM,看看自己所用版本的使用手册来解决版本上的差异。

Mpi程序运行的时候都是通过mpirun 后接参数和你的程序,gdb也是类似的过程,所以你不可以直接 gdb mpirun –np 3 myprogram,但你可以直接mpirun –gdb –np 3 myprogram。这样你就可以再gdb中调试你的程序了。

不过,这样有个问题,你可以调试在主节点运行的部分,也就是相对于集群而言,你本机所运行的部分,程序运行到子各个节点部分以后,你的gdb就不能继续调下去了,这个就是个问题。Gdb其实可以在程序已经执行了以后,再挂载你的程序,这样你可以在程序执行的期间把gdb挂载进来。简而言之就是把程序暂停起来(比如读个键盘输入getchar()之类的),用gdb myprogram pid myprogram是你程序的进程名, pid是你程序进程的pid号)如何查看pid号呢? 在终端里面运行 ps –a 就可以了,这样就可以找到你自己程序的进程名和PID号,gdb myprogram 1234 这样就可以挂载到你要调试的位置了。

但子节点有两种情况,一种情况是子节点运行的那部分程序运行在集群中其他的计算机上面;另一种情况是都在本机运行。第一种情况较容易解决,只要在程序运行后,暂停子节点运行的那部分程序(在子节点就不可以用getchar()了,我用sleep()函数来解决这个问题),ssh上去子节点计算机上面,在子节点上面ps –a查进程信息 gdb mp 1234 挂载进去调试,不过要确保子节点上面也安装了GDB。第二种情况,因为在本机运行上面开了多个你自己程序的进程,这样会同时出现 3myprogram,虽然pid各不相同,不过程序名完全一样,占用内存不是有内存泄露也几乎一样,其中一个是主节点的进程,另外几个是子节点的进程,这样要知道哪个进程是子节点部分的,就要在子节点部分获取所对应的进程的pid,很简单,只要在代码中加入:

#include <sys/types.h>

#include 
<unistd.h>

//

int pid;

pid 
= getpid();

 

printf ( “\n
%d\n”, pid );

//

 

这样就可以根据获取的pid信息来确定要挂载到哪个进程里面。补充一点,有种情况,有几个子节点同时运行,程序中某个子节点运行的部分由段错误,会自己终止,这样其他子节点也会跟着那个子节点一起终止,不管你有没有挂载gdb到进程里面,这样可以吧会崩溃的子节点用sleep睡一段足够长的时间,这样可以单独调试某个子节点的部分,而不至于过早终止。

 

顺便问个问题,怎么让mpi的程序内存转储(core dump),直接运行程序可以,加上mpirun以后就不可以core dump了,麻烦知道的告诉我一下coding.game$gmail.com,非常感激。

 

推荐大家读这篇:Using gdb and ddd with MPI

http://www.cnblogs.com/cy163/archive/2008/04/12/765737.html

posted @ 2009-10-14 21:52 头发抽筋 阅读(226) 评论(0) 编辑
http://oss.org.cn/ossdocs/gnu/linux/core.html
posted @ 2009-10-10 18:55 头发抽筋 阅读(27) 评论(0) 编辑
摘要: http://xmx0632.blogbus.com/logs/41683850.html 关键是这句 sudo mount -t vboxsf 你共享数据空间 挂载点挂载点一般形式为 /home/用户/一个文件夹阅读全文
posted @ 2009-09-15 17:04 头发抽筋 阅读(703) 评论(0) 编辑
摘要: [代码]这样调用,运行到第三条语句的时候总是提示"Failed to open DIB file" 用fopen函数能正确找到需要打开的位图文件,觉得十分离奇,后来看了下auxDIBImageLoad 函数的 参数类型被囧到了, 是 LPCSTR.... 第三条语句改成 testbbb = auxDIBImageLoad ( _T("2.bmp")); 就对了阅读全文
posted @ 2009-07-29 01:26 头发抽筋 阅读(1763) 评论(0) 编辑
摘要: 今天买了本windows图形编程, 袁风,机械工业出版社(N年前就绝版了,淘宝上买的复印版,效果比有些正版书要好), 在我运行书中示例程序 "Hello2.cpp" 的时候,发现程序无法在我自己建的工程里面运行,提示 niubilityHelloWorld error LNK2019: 无法解析的外部符号 _main ,该符号在函数 _mainCRTStartup 中被引用我使用的是 vs2003...阅读全文
posted @ 2009-03-08 00:26 头发抽筋 阅读(295) 评论(0) 编辑
摘要: 近日用C++做个程序,淡淡的对C++有了更进一步的认识,我在用C++的时候要是做个复杂点的全局设计,总感觉无从下手,一直在思考如何组织整个框架个部分是如何的衔接,怎样抽象出接口,感觉自己被包围在设计模式和各种面向对象编程的规范里面,在电脑前座了一个下午,全部都是思考这些让我很不爽的东西,我也知道面向对象一大堆的好处,这些好处列出来也许比我知道的编程对我的好处还多,不过我突然怀念起了C语言的简洁,在...阅读全文
posted @ 2008-10-09 19:26 头发抽筋 阅读(184) 评论(2) 编辑