今天看ccsp的题目看到了他支持c++自带的多线程thread,就简单学了一下,没有深入。
Thread t1; 并没有实际上开一个线程 必须指明t1要执行的函数,也就是写上构造函数 t1(run);
join函数和detach的区别:join会使主线程阻塞,等待子线程们完成后继续;detach会使主线程和子线程分离,不需等待。
一个简单的矩阵乘法:
(多线程的情况下clock()就不好用了,所以用了别的计时方法)
#include <bits/stdc++.h>
using namespace std;
using namespace std::chrono;
#define maxn 5010
int a[maxn][maxn], b[maxn][maxn], c[maxn][maxn];
int n;
void pre()
{
for (int i = 0; i < n; i++)
for (int j = 0; j < n; j++)
a[i][j] = rand() % 100;
for (int i = 0; i < n; i++)
for (int j = 0; j < n; j++)
b[i][j] = rand() % 100;
}
void run(int l, int r)
{
for (int k = 0; k < n; k++)
for (int i = l; i < r; i++)
for (int j = 0; j < n; j++)
c[i][j] += a[i][k] * b[k][j];
}
int main()
{
int T, l, r;
cin >> n >> T;
pre();
auto start = steady_clock::now();
vector<thread> t;
int bas = ceil(n * 1.0 / T);
for (int i = 0; i < T; i++)
{
l = i * bas;
r = min(n, (i + 1) * bas);
t.push_back(thread(run, l, r));
}
for (int i = 0; i < t.size(); i++)
t[i].join();
auto end = steady_clock::now();
for (int i = 0; i < n; i++)
printf("%d\n", c[1][i]);
cout << "cos:" << duration_cast<microseconds>(end - start).count() * 1.0 / 1e3 << "ms" << endl;
return 0;
}
然后是串行的代码的一点访存优化
#include <bits/stdc++.h>
using namespace std;
using namespace std::chrono;
#define maxn 5010
int a[maxn][maxn], b[maxn][maxn], c[maxn][maxn];
int n;
void pre()
{
for (int i = 0; i < n; i++)
for (int j = 0; j < n; j++)
a[i][j] = rand() % 100;
for (int i = 0; i < n; i++)
for (int j = 0; j < n; j++)
b[i][j] = rand() % 100;
}
int main()
{
cin >> n;
pre();
auto start = steady_clock::now();
int bas = 4;
// for (int i = 0; i < n; i++)
// for (int j = 0; j < n; j++)
// {
// int sum = 0;
// for (int k = 0; k < n; k++)
// sum += a[i][k] * b[k][j];
// c[i][j] = sum;
// }
for (int k = 0; k < n; k++)
for (int i = 0; i < n; i++)
{
int r = a[i][k];
for (int j = 0; j < n; j++)
c[i][j] += r * b[k][j];
}
// int i, j, k, ii, jj, kk;
// for (i = 0; i < n; i += bas)
// for (j = 0; j < n; j += bas)
// for (k = 0; k < n; k += bas)
// for (ii = i; ii < i + bas; ii++)
// for (jj = j; jj < j + bas; jj++)
// for (kk = k; kk < k + bas; kk++)
// c[ii][jj] += a[ii][kk] * b[kk][jj];
auto end = steady_clock::now();
for (int i = 0; i < n; i++)
printf("%d\n", c[1][i]);
cout << "cos:" << duration_cast<microseconds>(end - start).count() * 1.0 / 1e3 << "ms" << endl;
return 0;
}