gpt4 book ai didi

c - 矩阵加法/乘法的 pthread 加速

转载 作者:太空宇宙 更新时间:2023-11-03 23:32:40 25 4
gpt4 key购买 nike

我正在编写一个基本代码来添加两个矩阵并记下单线程和 2 个或更多线程所花费的时间。在该方法中,我首先将给定的两个矩阵(随机初始化)分成 THREADS 个段,然后将这些段中的每一个发送到加法模块,该模块由 pthread_create 调用启动。并行加法函数的参数如下。

struct thread_segment
{
matrix_t *matrix1, *matrix2, *matrix3;
int start_row, offset;
};

指向两个源矩阵和一个目标矩阵的指针。 (一旦源和目标可能指向同一个矩阵)。 start_row 是特定线程应从其开始添加的行,offset 告诉直到该线程应从 start_row 开始添加多少。

matrix_t 是一个简单的结构,定义如下:

typedef struct _matrix_t
{
TYPE **mat;
int r, c;
} matrix_t;

我用 2 个线程编译它,但是当我用 10000 x 10000 矩阵运行时(几乎)没有加速。我正在用 time -p 程序记录运行时间。

矩阵随机初始化也是像上面一样并行完成的。

我认为这是因为所有线程都在同一个矩阵地址区域工作,可能是因为瓶颈没有进行任何加速。尽管所有线程都将在矩阵的不同部分上工作,但它们不会重叠。

之前我实现了一个并行合并排序和一个快速排序,它们也显示出相似的特征,当我将特定线程要在其上工作的数据段复制到新分配的内存时,我能够获得加速。

我的问题是,这是因为:

  1. 内存瓶颈?
  2. 时间基准没有以正确的方式完成?
  3. 数据集太小?
  4. 编码错误?
  5. 其他

在这种情况下,如果是内存瓶颈,那么每个并行程序是否都使用独占内存区域,即使可以在没有互斥锁的情况下对共享内存进行线程的多次访问?

编辑

当我制作像这样的矩阵段时,我可以看到加速

  curr = 0;
jump = matrix1->r / THREADS;

for (i=0; i<THREADS; i++)
{
th_seg[i].matrix1 = malloc (sizeof (matrix_t));
th_seg[i].matrix1->mat = &(matrix1->mat[curr]);
th_seg[i].matrix1->c = matrix1->c;
th_seg[i].matrix1->r = jump;

curr += jump;
}

也就是在传递之前,在结构体中分配本线程要处理的矩阵的基地址,并存储行数。所以现在每个线程的每个矩阵的基址都是不同的。但前提是我多次添加一些 100 x 100 的小维度矩阵。在每次迭代中调用并行添加之前,我将重新分配随机值。这里注意到的加速是真的吗?还是由于其他一些现象的影响?

最佳答案

要优化内存使用,您可能需要查看 loop tiling .这将有助于更新缓存内存。在这种方法中,您将矩阵分成更小的 block ,这样缓存就可以保存更长时间的值,并且不需要经常自行更新。
另请注意,创建多个线程只会增加在它们之间切换的开销。

为了了解正确的实现对并发程序的运行时间有多大影响,这些是将两个矩阵相乘的程序的结果:naive、cocnurrent 和 tiling-concurrent:

seconds  name    
10.72 simpleMul
5.16 mulThread
3.19 tilingMulThread

关于c - 矩阵加法/乘法的 pthread 加速,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12233387/

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