我已经制作了BFS算法的并行版本,现在我正在尝试序列化相同的algrithm以了解加速。 我的代码是这样的:
#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");
}
请注意,这是一个以前的CUDA计划......
另外,我正在用g ++编译,所以我可以使用bool变量。
问题是:我在第一次运行BFS功能的时候吃午饭就会出现段故障。
答案 0 :(得分:2)
para
并未指向任何内容,但您已分配给它。
将其声明为bool para
并传递¶
而不是