2011-11-01 5 views
0

BFS 알고리즘의 병렬 버전을 만들었습니다. 이제 속도 향상 아이디어를 얻기 위해 같은 알고리즘을 직렬화하려고합니다. 내 코드는 이것이다 : 그것은 포머 CUDA 프로그램하다는BFS 순차 알고리즘의 분할 오류

#include <stdio.h> 
#include <stdlib.h> 
#include <math.h> 

struct Node 
{ 
    int begin;  // begining of the substring 
    int num; // size of the sub-string 
}; 

void BFS (Node *Va, int *Ea, bool* Fa, bool *Xa, int *Ca,bool *para, int tid) 
{ 

    int nid; 

     if (Fa[tid] == true && Xa[tid] == false) 
     { 
      Fa[tid] = false; 

        for (int i = Va[tid].begin; i < (Va[tid].begin + Va[tid].num); i++) // Va begin is where it's edges' subarray begins, Va is it's                  number of elements 
      {   
       nid = Ea[i]; 

       if (Xa[nid] == false) 
       { 
        Ca[nid] = Ca[tid] + 1; 
        Fa[nid] = true; 
        *para = true; 
       } 
      } 
      Xa[tid] = true; 
     } 

} 

int main() 
{ 


    struct Node Va[4]; 
    Va[0].begin=0; 
    Va[0].num=2; 
    Va[1].begin=1; 
    Va[1].num=0; 
    Va[2].begin=2; 
    Va[2].num=2; 
    Va[3].begin=1; 
    Va[3].num=0; 
    int edges[]={1,2,3,1}; 
    //cudaMalloc((void**)&Va,sizeof(Node)*4); 
    //cudaMemcpy(Va,node,sizeof(Node)*4,cudaMemcpyHostToDevice); 

    int Ea[4]={1,2,3,3}; 
    //cudaMalloc((void**)&Ea,sizeof(Node)*4); 
    //cudaMemcpy(Ea,edges,sizeof(Node)*4,cudaMemcpyHostToDevice); 

    bool Fa[4]={false};  
    int source=0; 
    Fa[source]=true; 
    //cudaMalloc((void**)&Fa,sizeof(bool)*4); 
    //cudaMemcpy(Fa,frontier,sizeof(bool)*4,cudaMemcpyHostToDevice); 

    bool Xa[4]={false}; 
    //cudaMalloc((void**)&Xa,sizeof(bool)*4); 
    //cudaMemcpy(Xa,visited,sizeof(bool)*4,cudaMemcpyHostToDevice); 

    int Ca[4]={0}; 
    //cudaMalloc((void**)&Ca,sizeof(int)*4); 
    //cudaMemcpy(Ca,custo,sizeof(int)*4,cudaMemcpyHostToDevice); 

    //dim3 grid(1,1,1); 
    //dim3 threads(4,1,1); 


    bool* para; 
    int i=1,n=0,j; 


    for (j=0; j<4 ; j++) 
    { 
    BFS(Va,Ea,Fa,Xa,Ca,para,j); 

    printf("Run number: %d >> ",n); 
    for(int i=0;i<4;i++) 
     printf("%d ",Ca[i]); 
    printf("\n"); 


    printf ("\n    Xa :"); 
    for(int i=0;i<4;i++) 
     printf("%d ",Xa[i]); 
    printf("\n\n"); 



    n++; 
    printf("%d",n); 
    } 



     printf("\nFinal:\n"); 
    for(int i=0;i<4;i++) 
     printf("%d ",Ca[i]); 
    printf("\n"); 

} 

주 ... 또한

, 나는 그래서 부울 변수를 사용할 수 있습니다 ++ g로 컴파일하고있다.

문제는 다음과 같습니다. 점심 시간에 BFS 기능을 실행하자 마자 seg fault가 발생합니다.

답변

2

para은 아직 지정하지 않았지만 할당 할 수 있습니다.

bool para으로 지정하고 &para을 대신 전달하십시오.