代码拉取完成,页面将自动刷新
同步操作将从 He Lei/ThreadPool 强制同步,此操作会覆盖自 Fork 仓库以来所做的任何修改,且无法恢复!!!
确定后同步将在后台操作,完成时将刷新页面,请耐心等待。
#include "queue_pool.h"
#include <cstdio>
#include <cstdlib>
#include "assert.h"
// 测试
// 并行化与串行化的矩阵向量乘法
struct PartJob {
int begin; int end;
int len; int* m;
int* v; int* out;
};
void* partial_mxv(void* arg) {
PartJob* p = (PartJob*)arg;
for (int i = p->begin; i < p->end; ++i) {
p->out[i] = 0;
for (int j = 0; j < p->len; ++j) {
p->out[i] += p->m[i * p->len + j] * p->v[j];
}
}
return 0;
}
// 利用 OpenMP directive 进行加速
void omp_mxv(void* arg) {
PartJob* p = (PartJob*)arg;
int i, j;
#pragma omp parallel for private(i, j) shared(p)
for (i = p->begin; i < p->end; ++i) {
p->out[i] = 0;
for (j = 0; j < p->len; ++j) {
p->out[i] += p->m[i * p->len + j] * p->v[j];
}
}
}
int main(int argc, char const *argv[]) {
// 这个问题的并行化程度很高,能够很接近完美加速
// 分配矩阵 m 和 v, out 的空间
int row = 8000;
int col = 8000;
int thread_num = 700;
int job_num = 400;
int* m = (int*)malloc(row * col * sizeof(int));
int* v = (int*)malloc(col * sizeof(int));
int* out = (int*)malloc(row * sizeof(int));
for (int i = 0; i < row * col; ++i) {
m[i] = 1;
}
for (int i = 0; i < col; ++i) {
v[i] = 1;
}
// 初始化并运行线程池
ThreadPool p(thread_num);
p.run();
// 拆分并分配任务
clock_t t = clock();
PartJob* jobs = new PartJob[job_num];
int row_job = row / job_num;
for (int i = 0; i < job_num; ++i) {
jobs[i].begin = i * row_job;
if (jobs[i].begin + row_job >= row) {
jobs[i].end = row;
} else {
jobs[i].end = jobs[i].begin + row_job;
}
jobs[i].m = m;
jobs[i].v = v;
jobs[i].out = out;
jobs[i].len = col;
p.dispatch(partial_mxv, jobs + i);
}
p.sync();
printf("parallel time : %d ms\n", clock() - t);
// 验证运算的正确性
for (int i = 0; i < row; ++i) {
assert (out[i] == col);
}
t = clock();
PartJob j;
j.begin = 0;
j.end = row;
j.m = m;
j.v = v;
j.out = out;
j.len = col;
partial_mxv(&j);
printf("sequential time : %d ms\n", clock() - t);
// 验证运算的正确性
for (int i = 0; i < row; ++i) {
assert (out[i] == col);
}
t = clock();
j.begin = 0;
j.end = row;
j.m = m;
j.v = v;
j.out = out;
j.len = col;
omp_mxv(&j);
printf("OpenMP time : %d ms\n", clock() - t);
// 验证运算的正确性
for (int i = 0; i < row; ++i) {
assert (out[i] == col);
}
delete [] jobs;
free(m);
free(v);
free(out);
printf("test over!\n");
getchar();
return 0;
}
此处可能存在不合适展示的内容,页面不予展示。您可通过相关编辑功能自查并修改。
如您确认内容无涉及 不当用语 / 纯广告导流 / 暴力 / 低俗色情 / 侵权 / 盗版 / 虚假 / 无价值内容或违法国家有关法律法规的内容,可点击提交进行申诉,我们将尽快为您处理。