用共享内存计算矩阵,结果有错,求帮助!!!

为当前最终发行版之前的所有版本提供支持
回复
zero_hsy
帖子: 37
注册时间: 2013-03-03 10:45
系统: ubuntu
送出感谢: 8 次
接收感谢: 0

用共享内存计算矩阵,结果有错,求帮助!!!

#1

帖子 zero_hsy » 2013-03-27 19:23

用共享内存计算矩阵,父进程计算一半,子进程计算另一半,结果保存在共享内存中,矩阵运算后有错!!!
可以保证运算时间确实少了一半,实现了并发,但是
当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);	
             }        
}

头像
zhw2101024
帖子: 1849
注册时间: 2009-03-28 16:10
系统: Arch debian win7
送出感谢: 9 次
接收感谢: 70 次
联系:

Re: 用共享内存计算矩阵,结果有错,求帮助!!!

#2

帖子 zhw2101024 » 2013-03-27 21:23

注释怎么都是乱码啊
babysoul
帖子: 75
注册时间: 2008-10-31 16:22
系统: Ubuntu 12.10
送出感谢: 0
接收感谢: 0

Re: 用共享内存计算矩阵,结果有错,求帮助!!!

#3

帖子 babysoul » 2013-03-28 15:09

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
zero_hsy
帖子: 37
注册时间: 2013-03-03 10:45
系统: ubuntu
送出感谢: 8 次
接收感谢: 0

Re: 用共享内存计算矩阵,结果有错,求帮助!!!

#4

帖子 zero_hsy » 2013-03-29 8:45

想尝试一下用共享内存,但是为什么会有段错误 (核心已转储),求解释啊
回复

回到 “老旧版本支持”