#include #include #include #include #include #include #include "mpi.h"
int i, j, k;
int n = 36;
int cmp(const void * a, const void * b)
void phase1(int *array, int n, int startindex, int subarraysize, int *pivots, int p)
return;
}void phase2(int *array, int startindex, int subarraysize, int *pivots, int *partitionsizes, int p, int myid)
} //傳送廣播
mpi_bcast(phase2pivots, p - 1, mpi_int, 0, mpi_comm_world);
// 進行主元劃分,並計算劃分部分的大小
for (i = 0; i < subarraysize; i++)
if (index == p)
partitionsizes[index]++; //劃分大小自增
} free(collectedpivots);
free(phase2pivots);
return;
}void phase3(int *array, int startindex, int *partitionsizes, int **newpartitions, int *newpartitionsizes, int p)
*newpartitions = (int *)malloc(totalsize * sizeof(int));
// 在傳送劃分之前計算相對於sendbuf的位移,此位移處存放著輸出到程序的資料
senddisp[0] = 0;
recvdisp[0] = 0; //計算相對於recvbuf的位移,此位移處存放著從程序接受到的資料
for (i = 1; i < p; i++)
//傳送資料,實現n次點對點通訊
mpi_alltoallv(&(array[startindex]), partitionsizes, senddisp, mpi_int, *newpartitions, newpartitionsizes, recvdisp, mpi_int, mpi_comm_world);
free(senddisp);
free(recvdisp);
return;
}void phase4(int *partitions, int *partitionsizes, int p, int myid, int *array)
partitionends[p - 1] = totallistsize;
sortedsublist = (int *)malloc(totallistsize * sizeof(int));
sublistsizes = (int *)malloc(p * sizeof(int));
recvdisp = (int *)malloc(p * sizeof(int));
// 歸併排序
for (i = 0; i < totallistsize; i++)
} sortedsublist[i] = lowest;
indexes[ind] += 1;
} // 傳送各子列表的大小回根程序中
mpi_gather(&totallistsize, 1, mpi_int, sublistsizes, 1, mpi_int, 0, mpi_comm_world);
// 計算根程序上的相對於recvbuf的偏移量
if (myid == 0)
} //傳送各排好序的子列表回根程序中
mpi_gatherv(sortedsublist, totallistsize, mpi_int, array, sublistsizes, recvdisp, mpi_int, 0, mpi_comm_world);
free(partitionends);
free(sortedsublist);
free(indexes);
free(sublistsizes);
free(recvdisp);
return;
}//psrs排序函式,呼叫了4個過程函式
void psrs_mpi(int *array, int n)
pivots = (int *)malloc(p * sizeof(int));
partitionsizes = (int *)malloc(p * sizeof(int));
newpartitionsizes = (int *)malloc(p * sizeof(int));
for (k = 0; k < p; k++)
// 獲取起始位置和子陣列大小
startindex = myid * n / p;
if (p == (myid + 1))
else
subarraysize = endindex - startindex;
mpi_barrier(mpi_comm_world);
//呼叫各階段函式
phase1(array, n, startindex, subarraysize, pivots, p);
if (p > 1)
if (myid == 0)
} //printf("\n");
if (p > 1)
free(partitionsizes);
free(newpartitionsizes);
free(pivots);
free(array);
mpi_finalize();
}int main(int argc, char *argv)
mpi_init(&argc, &argv); //mpi初始化
psrs_mpi(array, n); //呼叫psrs演算法進行並行排序
return 0;
}
高效能mysql(一) 建立高效能索引
單列索引和多列索引 單列索引 多個單列索引的選擇問題 多個or條件 多個單列的效能往往效能很低,盡量建立高效的多列索引。多列索引 選擇合適的索引順序 避免範圍條件 在where子句中,in是有效的,範圍條件會導致後面的索引無效!在order by中,範圍條件和in都會導致無法按照索引排序!按照索引順...
高效能mysql 樹 高效能mysql精要
1 explain 中 extra using index 表示覆蓋索引,sql優化中最好能使用覆蓋索引,否則 二級索引 需要回表查詢。所謂覆蓋索引,是指要查詢的列正好是索引,而條件也是這個索引之一 2 where 語句中 條件等於主鍵的 在核心索引層完成,條件等於非索引的,在服務層完成 3 讀索引...
mysql高效能索引 mysql高效能索引( )
在開發中,我們知道大多數應用的瓶頸在於sql語句的執行時耗,在這裡並不討論sql語句的安全,僅僅討論高效能sql語句,而與高效能sql語句緊密相連的就是傳說中的 索引。索引 一種工作在儲存引擎端的用於快速找到記錄的一種資料結構。mysql使用索引的方式是 先找到索引的值,再根據索引的值找到資料行。索...