高效能作業PSRS

2021-08-14 05:49:42 字數 3085 閱讀 3026

#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使用索引的方式是 先找到索引的值,再根據索引的值找到資料行。索...