【发布时间】:2015-10-30 15:17:42
【问题描述】:
所以我在 400 万个节点上做一些计算。
非常酷的串行版本只有一个 for 循环,循环 400 万次并进行 400 万次计算。这大约需要 1.2 秒。
当我将 for 循环拆分为 4 个 for 循环并且每个循环执行 1/4 的计算时,总时间变为 1.9 秒。
我猜在创建 for 循环时会有一些开销,并且可能与 cpu 喜欢以块计算数据有关。
真正困扰我的是,当我尝试在 8 核机器上将 4 个循环放到 4 个线程上时,每个线程需要 0.9 秒才能完成。 我希望他们每个人只需要 1.9/4 秒。
我不认为有任何竞争条件或同步问题,因为我所做的只是有一个 for 循环来创建 4 个线程,这需要 200 微秒。然后一个 for 循环将它们连接起来。
计算从共享数组读取并写入不同的共享数组。 我确信他们没有写入同一个字节。
开销从何而来?
main: ncores: 核心数。 node_size:图的大小(400万节点)
for(i = 0 ; i < ncores ; i++){
int *t = (int*)malloc(sizeof(int));
*t = i;
int iret = pthread_create( &thread[i], NULL, calculate_rank_p, (void*)(t));
}
for (i = 0; i < ncores; i++)
{
pthread_join(thread[i], NULL);
}
calculate_rank_p:vector为页面排名计算的排名向量
Void *calculate_rank_pthread(void *argument) {
int index = *(int*)argument;
for(i = index; i < node_size ; i+=ncores)
current_vector[i] = calc_r(i, vector);
return NULL;
}
calc_r:这只是使用压缩行格式的页面排名计算。
double calc_r(int i, double *vector){
double prank = 0;
int j;
for(j = row_ptr[i]; j < row_ptr[i+1]; j++){
prank += vector[col_ind[j]] * val[j];
}
return prank;
}
所有未声明的都是全局变量
【问题讨论】:
-
贴出代码,让我们看看问题出在哪里。
-
解决此问题所需的时间比某些代码发布的时间要长。因此,通过一次性(并行)发布所有需要的代码、输入和预期输出),这可以快速推进,而不是连续要求各种信息。
-
Ohwait.. 'for(i = index; i
-
你应该给每个线程一个连续的整数块来处理,'i++',而不是'i+=ncores'。
-
ncores 是核心数(线程)。就我而言,4.
标签: c parallel-processing pthreads