【发布时间】:2013-03-14 10:16:36
【问题描述】:
在 pthread 编程中我仍然不太确定。 如果有人能告诉我一个绝对的答案,我将不胜感激。
我之前的问题在这里: How do I assign array variable in a simple Pthread programming?
现在,我正在研究矩阵乘法。 使用它效果很好:
typedef struct {
int rowIdx;
int (*matA)[SIZE], (*matB)[SIZE], (*matC)[SIZE];
} newType;
int main (){
int matriksA[SIZE][SIZE];
int matriksB[SIZE][SIZE];
int matriksC[SIZE][SIZE];
for (i=0;i<NUM_THREAD;i++) {
(*block).rowIdx = i;
(*block).matA = matriksA;
(*block).matB = matriksB;
(*block).matC = matriksC;
pthread_create(&arrThread[i], NULL, matrixMul, (void *)block);
block++;
}
}
void *matrixMul(void *x){
newType *p = (newType *) x;
int i = (*p).rowIdx;
int j,k;
for (j=0;j<SIZE;j++){
int result = 0;
for(k=0;k<SIZE;k++){
int MAik = (*p).matA[i][k];
int MBkj = (*p).matB[k][j];
result = result + (MAik*MBkj);
}
(*p).matC[i][j] = result;
}
pthread_exit(NULL);
}
matrixMul 正在做矩阵乘法 matC = matA x matB。
我之前尝试过使用这个结构,但是没有用。
typedef struct {
int rowIdx;
int **matA, **matB, **matC;
} newType;
显然,从我所读到的,变量数组可以被认为是一个指针,它保存着数组中第一个元素的地址。至于二维数组,我们必须告诉编译器列的大小。因此我们必须在 typedef 结构中使用 (*matA)[SIZE] 而不是 **matA。
但我仍然不确定我在那里做什么。 我只是通过分配指针将二维数组复制到另一个二维数组还是什么? 有点混乱……哈哈……
我的下一个问题是关于这些方面的:
(*block).matA = matriksA;
(*block).matB = matriksB;
(*block).matC = matriksC;
那里究竟发生了什么?上面代码中的每个 block 变量是否都有自己的矩阵数据副本?或者他们只是通过让他们的指针指向内存中的相同位置来共享它,这意味着 matA、matB 和 matC 的行为就像一个静态变量(如在面向对象编程中)?也就是说,matA、matB、matC是否只有一份?线程是否同时访问共享数据?还是'matA's有很多副本,并且每个副本在RAM中都有自己不同的分配?
与我的第一篇文章相同的问题,这些行后面发生了什么? (*z).arrA = arrayA; (*z).arrB = arrayB; (*z).arrC = 数组C;
上面的代码是否足够有效地完成任务(数组加法和矩阵乘法)?或者从内存分配的角度来看,还有其他更有效的方法吗?
@Code-Guru:我已经发布了新问题。
【问题讨论】:
-
(*block).matA等价于block->matA。您可以使用 SIMD 指令更有效地执行此操作。特殊用途的矩阵有很多优化,比如备用或对称。一般人必须做该做的工作。您可以将乘法划分为单独的线程或直接到机器级别的代码。许多机器都有乘法和累加指令。一个体面的编译器会识别这一点并将其与您拥有的代码一起使用。唯一的另一个技巧是启动循环以获得最佳内存访问。 -
对不起,那是 sparse 矩阵。通过这个stack overflow question可以看到,你的方法已经很不错了。
-
您在顶部的代码确实是正确的声明。可以肯定的是,它们是指针。像所有非空指针一样,它们是有类型的。在这种情况下,它们被键入为“指向 SIZE 整数数组的指针”。您是正确的,第二个 decl(您尝试但没有成功的那个)不正确。这些不是指向数组的指针;它们是指向指针的指针,通常用于模拟不连续的多维数组分配。我在您的代码中看到的最直接的问题是
block的递增。由于没有decl,我无法判断是否有N个,每个线程一个。
标签: c pointers variable-assignment matrix-multiplication