- 本文的Linux包括VMare和windows下的WSL环境下安装metis串行和并行
- 本文还讲述了电脑的线程以及和超线程的区别,如何寻找,如何判别,请看下文
装备:
- Ubuntu18.6.4LTS
- gcc7.5.0
- cmake version 3.10.2
别相信网上的一键sudo apt-get install libmetis-dev
,有很多问题!!!
A/include/metis.h
,根据自己电脑的位数(32or64)选择// 64位
#define IDXTYPEWIDTH 64
// 32位
#define IDXTYPEWIDTH 32
make config
make
sudo make install
可能出现的问题:
配置环境
sudo vim /etc/ld.so.conf
include /usr/local/bin
保存sudo ldconfig
更新测试环境
#include <cstddef> /* NULL */
#include <metis.h>
#include <iostream>
#include <vector>
int main(){
idx_t nVertices = 6;//顶点个数
idx_t nEdges = 7;//边的条数
idx_t nWeights = 1;//权重
idx_t nParts = 2;//几类
idx_t objval;
std::vector<idx_t> part(nVertices, 0);
// Indexes of starting points in adjacent array
std::vector<idx_t> xadj = {0,2,5,7,9,12,14};
// Adjacent vertices in consecutive index order
std::vector<idx_t> adjncy = {1,3,0,4,2,1,5,0,4,3,1,5,4,2};
// Weights of vertices
// if all weights are equal then can be set to NULL
std::vector<idx_t> vwgt(nVertices * nWeights, 0);
int ret = METIS_PartGraphKway(&nVertices,& nWeights, xadj.data(), adjncy.data(),
NULL, NULL, NULL, &nParts, NULL,
NULL, NULL, &objval, part.data());
std::cout << ret << std::endl;
for(unsigned part_i = 0; part_i < part.size(); part_i++){
std::cout << part_i << " " << part[part_i] << std::endl;
}
return 0;
}
g++ -std=c++11 test.cpp -o test -lmetis
1
0 1
1 0
2 0
3 1
4 1
5 0
**ps:**分割是随机的,只要看你是不是分为0,1共2类
mt-metis就是metis的多线程版本,能够进行并行计算
A/metis/include/metis.h
,根据自己电脑的位数(32or64)选择// 64位
#define IDXTYPEWIDTH 64
// 32位
#define IDXTYPEWIDTH 32
./configure
make
sudo make install
./configure:command not found
解决办法:sh configure
然后添加执行权限 chmod u+x configure
bash ./configure
即可mtmetis test.graph 2 test.part -t -T n
解释:
10 10
10 2
1 3
2 4
3 5
4 6
5 7
6 8
7 9
8 10
9 1
2
是分成的类别数量test.part
是分割后生成的文件-t
能显示mtmetis的运行时间-T n
n代表线程数量,默认以全部线程数,不能超过最大的线程数接着上题,你可能会疑惑该如何查找自己的线程数量为多少?那什么又是超线程呢?