当前时区为 UTC + 8 小时



发表新帖 回复这个主题  [ 4 篇帖子 ] 
作者 内容
1 楼 
 文章标题 : 用共享内存计算矩阵,结果有错,求帮助!!!
帖子发表于 : 2013-03-27 19:23 

注册: 2013-03-03 10:45
帖子: 37
系统: ubuntu
送出感谢: 8
接收感谢: 0 次
用共享内存计算矩阵,父进程计算一半,子进程计算另一半,结果保存在共享内存中,矩阵运算后有错!!!
可以保证运算时间确实少了一半,实现了并发,但是
当M=20,正确
当M=300,正确
可是当M=400甚至>=400时,出现:
The begin address of first shared memory is: 1ac3000, ,The size of one item is 8,
段错误 (核心已转储)

为什么会有段错误啊???求帮助!!!

代码:
#include<stdio.h>
#include<time.h>
#include<pthread.h>
#include<stdlib.h>
#include<unistd.h>
#include<memory.h>
#include <sys/types.h>
#include <sys/ipc.h>
#include <sys/shm.h>
#include <stdlib.h>

#define M 300
#define SHMSZ  M*M

int matrixOriginal[M][M];

void *func(void *arg);

int main()
{
   int i,j,k;
   for (i=0;i<M; i++)
      for(j=0;j<M; j++)
              matrixOriginal[i][j] = 1;

   printf("The original is:\n");      
        for (i=0;i<M;i++){
           for (j=0;j<M;j++)
         printf("%d,\t",matrixOriginal[i][j]);
      printf("\n"); }


       int shmid,shmid2;
       key_t key,key2;
       int *shm, *shm2;

       /*
        * ׌±žÉêÇ벢ʹÓÃÕâžöϵͳÖÐµÄ µÚ6189# shared memory
        */
       key = 6189;


       if ((shmid = shmget(key, SHMSZ, IPC_CREAT | 0660)) < 0) {   //ŽŽœš²Ù×÷£¬¿É¶Á¿ÉÐŽ
           perror("shmget");
           exit(1);
       }

   
       /*
        * °ÑÕâÒ»¿éÕ³ÔÚ±Ÿœø³ÌµÄµØÖ·¿ÕŒäÖ®ÖÐ
        */
       if ((shm = (int *)shmat(shmid, 0, 0)) == (int *) -1) {   
           perror("shmat");
           exit(1);
       }

   printf("The begin address of first shared memory is: %x,\t,The size of one item is %d,\n",(unsigned int)shm,sizeof(shm));


       for (i=0;i<SHMSZ;i++)
            shm[i]=0;

/*
       key2 = 6190;


       if ((shmid2 = shmget(key2, SHMSZ, IPC_CREAT | 0660)) < 0) {   //ŽŽœš²Ù×÷£¬¿É¶Á¿ÉÐŽ
           perror("shmget");
           exit(1);
       }

   

       if ((shm2 = (char *)shmat(shmid2, 0, 0)) == (char *) -1) {   
           perror("shmat");
           exit(1);
       }

   printf("The begin address of first shared memory is: %x,\t,The size of one item is %d,\n",(unsigned int)shm2,sizeof(shm2));


       for (i=0;i<SHMSZ;i++)
            shm[i]=0;

*/

      pid_t  pid;

      int from=M/2;
       if ((pid = fork()) < 0)
           printf("fork error");
       else if (pid == 0) {      /* ×Óœø³Ì³Ðµ£ºóÒ»°ëµÄŒÆËãÁ¿ */
      for (i=from;i<M;i++)
                 for (j=0;j<M;j++)
            for (k=0;k<M;k++)
                          shm[(i*M+j)]=shm[(i*M+j)]+matrixOriginal[i][k]*matrixOriginal[k][j];
      //exit(0);
          }
       else {   /* žžœø³Ì³Ðµ£Ç°Ò»°ëµÄŒÆËãÁ¿ */
      for (i=0;i<from;i++)
                 for (j=0;j<M;j++)
                      for (k=0;k<M;k++)
                          shm[(i*M+j)]=shm[(i*M+j)]+matrixOriginal[i][k]*matrixOriginal[k][j];
      /* µÈŽý×Óœø³ÌÖÕÖ¹£¬Ö®ºóÊä³öŸØÕóµÄÔËËãœá¹û */
      wait((int ) 0);   
      printf("The result is:\n");      
                 for (i=0;i<M;i++) {
                      for (j=0;j<M;j++)
                 printf("%d,\t",shm[(i*M)]);
      
            printf("\n");}
      
      if(shmctl(shmid, IPC_RMID,0)<0)
         perror("shm remove error");
      //if(shmctl(shmid2, IPC_RMID,0)<0)
         //perror("shm2 remove error");
                //exit(0);   
             }       
}



页首
 用户资料  
 
2 楼 
 文章标题 : Re: 用共享内存计算矩阵,结果有错,求帮助!!!
帖子发表于 : 2013-03-27 21:23 
头像

注册: 2009-03-28 16:10
帖子: 1849
系统: Arch debian win7
送出感谢: 10
接收感谢: 70
注释怎么都是乱码啊


_________________
为什么我的问题总是没有人回答?

金钱、责任与荣誉:OpenSSL主席谈心脏出血
拥有丰富API接口和广泛程序支持的dropbox云同步,点此注册,开始就比别人多500兆,我的空间也会增加。谢啦
==========我的作品==========
我做的一个面向开发者的gnome-shell扩展,有js基础又想自己调整gnome-shell功能的可以尝试一下
gnome-shell扩展开发入门,gnome-shell扩展系统扫盲帖


页首
 用户资料  
 
3 楼 
 文章标题 : Re: 用共享内存计算矩阵,结果有错,求帮助!!!
帖子发表于 : 2013-03-28 15:09 

注册: 2008-10-31 16:22
帖子: 75
系统: Ubuntu 12.10
送出感谢: 0 次
接收感谢: 0 次
wait((int)0) 那里编译不过,但是如果没有wait,输出的数据可能没有同步
系统给单个进程分配的最大共享内存是有上限的
实现矩阵相乘,不需要使用共享内存,共享内存一般是进程间通讯使用的
多核CPU的话,在堆上分配好内存,开几个多线程
有CUDA神马的直接就在GPU上运算就好了


_________________
Hasee F545T: Core2 Duo T5450, 2G RAM, 320G HD, ATI HD2400 14.4, Archlinux
Lenovo ideapad Y580: i7 3630M, 8G RAM, 1T HD, nVidia GTX660M, Ubuntu 13.04


页首
 用户资料  
 
4 楼 
 文章标题 : Re: 用共享内存计算矩阵,结果有错,求帮助!!!
帖子发表于 : 2013-03-29 8:45 

注册: 2013-03-03 10:45
帖子: 37
系统: ubuntu
送出感谢: 8
接收感谢: 0 次
想尝试一下用共享内存,但是为什么会有段错误 (核心已转储),求解释啊


页首
 用户资料  
 
显示帖子 :  排序  
发表新帖 回复这个主题  [ 4 篇帖子 ] 

当前时区为 UTC + 8 小时


在线用户

正在浏览此版面的用户:Baidu [Spider], Google [Bot] 和 3 位游客


不能 在这个版面发表主题
不能 在这个版面回复主题
不能 在这个版面编辑帖子
不能 在这个版面删除帖子
不能 在这个版面提交附件

前往 :  
本站点为公益性站点,用于推广开源自由软件,由 DiaHosting VPSBudgetVM VPS 提供服务。
我们认为:软件应可免费取得,软件工具在各种语言环境下皆可使用,且不会有任何功能上的差异;
人们应有定制和修改软件的自由,且方式不受限制,只要他们自认为合适。

Powered by phpBB © 2000, 2002, 2005, 2007 phpBB Group
简体中文语系由 王笑宇 翻译