并行单边jacobi算法 奇偶序列

来源:互联网 发布:ubuntu退出vim命令 编辑:程序博客网 时间:2024/04/30 14:18

单边jacobi算法大家都非常熟悉,就是不停地计算旋转矩阵,简单说就是计算c和s,然后旋转。然而其中做一轮旋转(任何两列都需要旋转一次)需要n*(n-1)/2次单独的旋转,这样的旋转其实是可以并行来实现的,这也就是为何jacobi算法最近比较热门的原因了。

通过这几天研究jacobi算法,我选择了从奇偶序列着手来实现其并行算法。

下面是8*8的矩阵,其中for循环可以做并行实现的,但是pc机上不支持并行,只有FPGA上面可以实现并行,所以下一步打算从FPGA上面入手,实现并行jacobi算法的硬件。

void jacobi()
{
double a[Matrix_M][Matrix_M]={{0.4218   , 0.6787,    0.2769  ,  0.4387   , 0.7094   , 0.9597  ,  0.8909  ,  0.8143}
,{ 0.9157   , 0.7577   , 0.0462  ,  0.3816   , 0.7547 ,   0.3404,    0.9593  ,  0.2435}
,{  0.7922 ,   0.7431 ,   0.0971 ,   0.7655  ,  0.2760  ,  0.5853 ,   0.5472 ,   0.9293}
,{  0.9595   , 0.3922  ,  0.8235  ,  0.7952   , 0.6797  ,  0.2238   , 0.1386 ,   0.3500}
,{  0.6557 ,   0.6555  ,  0.6948 ,   0.1869  ,  0.6551  ,  0.7513  ,  0.1493  ,  0.1966}
,{  0.0357 ,   0.1712 ,   0.3171   , 0.4898    ,0.1626  ,  0.2551  ,  0.2575  ,  0.2511}
,{ 0.8491,    0.7060  ,  0.9502  ,  0.4456,   0.1190  ,  0.5060   , 0.8407  ,  0.6160}
,{  0.9340 ,   0.0318 ,   0.0344  ,  0.6463 ,   0.4984  ,  0.6991 ,   0.2543,    0.4733}};
int cnt, l;
int order[Matrix_M]={1,2,3,4,5,6,7,8};
int couplenums;
int sequence[Matrix_M]={1,2,3,4,5,6,7,8};
int oddoreven;
int numi[Matrix_M];
int  numj[Matrix_M];
int k;
int m;
printf("##################################\n");
for(m=0;m<Matrix_M;m++){
for(cnt=0;cnt<Matrix_M;cnt++)
{
printf(" %10f ", a[m][cnt]);
}
printf("\n");
}
printf("\n##################################\n");
for(k=0;k<56;k++)
{
numbercreation(numi, numj , k,  sequence, &couplenums);
for(l=0;l<couplenums;l++){
Orthogonality_operation(numi[l], numj[l], a[numi[l]-1], a[numj[l]-1], order);
printf("\n##################################\n");
for(m=0;m<Matrix_M;m++){


for(cnt=0;cnt<Matrix_M;cnt++)
{
printf(" %10f ", a[m][cnt]);
}
printf("\n");


}
}
printf("\n##################################\n");
}
for(m=0;m<Matrix_M;m++)
{
printf(" %d ",order[m]);
}
}

0 0
原创粉丝点击