今天看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;
}