我正在编写一个基本代码来添加两个矩阵,并记下单线程和两个或多个线程所需的时间。在这种方法中,我首先将给定的两个矩阵(随机初始化)划分为线程数的段数,然后将每个矩阵发送到加法模块,该模块由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;我用两个线程编译了它,但是当我使用10000 x 10000矩阵运行时,几乎没有加速。我正在用time -p程序记录运行时间。
矩阵的随机初始化也是类似于上述并行进行的。
我认为这是因为所有线程都在同一个矩阵地址区域上工作,可能是因为这个瓶颈没有加速。尽管所有线程都将在矩阵的不同部分上工作,但它们并不重叠。
在此之前,我实现了一个并行合并和一个快速排序(它也显示了类似的特性),当我将特定线程要在其上工作的数据段复制到一个新分配的内存时,我能够获得加速。
我的问题是这是因为:
在这种情况下,如果是内存瓶颈,那么每个并行程序是否都使用独占内存区域,即使共享内存上的线程可以在没有互斥的情况下进行多次访问?
编辑
我可以看到加速,当我使矩阵段,如
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,说,很多次。在每次迭代中调用并行添加之前,我将重新分配随机值。这里注意到的加速是真的吗?或者是因为其他一些现象聊天的效果?
发布于 2012-09-02 05:51:53
要优化内存使用,您可能需要查看环瓦。这将有助于缓存内存的更新。在这种方法中,您可以将矩阵划分为较小的块,这样缓存就可以保存更长时间的值,并且不需要频繁地自我更新。
还要注意的是,创建多个线程只会增加它们之间切换的开销。
为了让人感觉到适当的实现会对并发程序的运行时间产生多大的影响,这些结果是程序将两个矩阵相乘的结果,它们是简单的、可育的和平铺并发的:
seconds name
10.72 simpleMul
5.16 mulThread
3.19 tilingMulThreadhttps://stackoverflow.com/questions/12233387
复制相似问题