gpt4 book ai didi

c++ - 使用 omp 生成矩阵会导致麻烦,不同的 columsizes

转载 作者:太空宇宙 更新时间:2023-11-04 13:25:06 25 4
gpt4 key购买 nike

我有一个问题和一个问题。我试着用 omp 做一些矩阵乘法。

如果我用多个线程创建矩阵 a、b 和 c,则列大小不相等。即使我对 push_back 使用 critical,问题仍然存在。我认为 omp 将 for 循环分成大小相等的部分,因此每个线程都应该有自己的列。问题出在?

给每个线程一个 vector 的好方法是什么?在没有关键和原子的情况下避免共享内存问题的好方法是什么,例如如果我正在生成数据并想将其保存在某个地方。谢谢。附言我正在学习我的英语。离完美还很远,所以请不要介意。

#include "stdafx.h"
#include <omp.h>
#include <iostream>
#include <ctime>
#include <vector>

#define NRA 300 /* number of rows in matrix A */
#define NCA 300 /* number of columns in matrix A */
#define NCB 300 /* number of columns in matrix B */

int main(int argc, char *argv[])
{
int i, j, k, chunk;

std::vector < std::vector<int> > a;
a.resize(NRA);
std::vector < std::vector<int> > b;
b.resize(NCA);
std::vector < std::vector<int> > c;
c.resize(NRA);
/*
double a[NRA][NCA];
double b[NCA][NCB];
double c[NRA][NCB];
*/
chunk = 10;

std::clock_t start; //Zeitmessung
double duration; //Zeitdauer der Parallelisierung


omp_set_num_threads(4);
#pragma omp parallel
{
#pragma omp for schedule (static, chunk)
for (i = 0; i < NRA; i++)
for (j = 0; j < NCA; j++)
a[i].push_back(i + j);
#pragma omp for schedule (static, chunk)
for (i = 0; i < NCA; i++)
for (j = 0; j < NCB; j++)
b[i].push_back(i*j);
#pragma omp for ordered schedule(static, chunk)
for (i = 0; i < NRA; i++)
for (j = 0; j < NCB; j++)
c[i].push_back(0);
}

for (int nthreads = 1; nthreads < 40; nthreads++)
{
start = std::clock();
omp_set_dynamic(0);
#pragma omp parallel shared(a,b,c,nthreads,chunk) private(i,j,k) num_threads(nthreads)
{

#pragma omp for schedule (static, chunk)
for ( i = 0; i < NRA; i++)
for (j = 0; j < NCB; j++)
c[i][j] = 0;

#pragma omp for ordered schedule (static, chunk)
for (i = 0; i < NRA; i++)
{
for ( j = 0; j < NCB; j++)
for (k = 0; k < NCA; k++)
c[i][j] += a[i][k] * b[k][j];
}
}

duration = (std::clock() - start) / (double)CLOCKS_PER_SEC;
//Time n threads need
std::cout << "Benoetigte Zeit fuer " << nthreads << " Threads betrug " << duration << " Sekunden." << std::endl;
}

std::cin.get();

}

最佳答案

push_back() 肯定会修改 vector 的元数据,尤其是大小。尝试 resize() 内部 vector ,就像处理外部 vector 一样(abc)然后只需修改并行运行中的元素(a[i] = i + j; 等)。

由于您一开始就知道元素的最终数量,因此您可以使用普通数组而不是 vector 来最大程度地减少开销。

int a[NRA][NCA];
int b[NCA][NCB];
int c[NRA][NCB];

我想知道你为什么把代码的类似部分注释掉了。 ;-)

关于c++ - 使用 omp 生成矩阵会导致麻烦,不同的 columsizes,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33631625/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com