【发布时间】:2010-05-24 10:33:39
【问题描述】:
我有一个使用 pthread 并行化的应用程序。应用程序有一个迭代例程调用和一个在例程中产生的线程(pthread_create 和 pthread_join),以并行化例程中的计算密集部分。当我使用 PIN 之类的检测工具收集统计信息时,该工具会报告多个线程的统计信息(线程数 x 迭代次数)。我相信这是因为每次调用例程时它都会产生新的线程集。
如何确保我只创建一次线程,并且所有后续调用都使用首先创建的线程。
当我对 OpenMP 执行相同操作然后尝试收集统计信息时,我发现线程只创建了一次。是因为 OpenMP 运行时吗?
编辑:
我只是给出了代码的简化版本。
int main()
{
//some code
do {
compute_distance(objects,clusters, &delta); //routine with pthread
} while (delta > threshold )
}
void compute_distance(double **objects,double *clusters, double *delta)
{
//some code again
//computation moved to a separate parallel routine..
for (i=0, i<nthreads;i++)
pthread_create(&thread[i],&attr,parallel_compute_phase,(void*)&ip);
for (i=0, i<nthreads;i++)
rc = pthread_join(thread[i], &status);
}
我希望这能清楚地解释问题所在。
- 我们如何保存线程 ID 并测试是否已经创建?
【问题讨论】:
-
第二个马塞洛。没有足够的信息来理解问题。代码可能完全按照您的要求执行(生成线程)。我们需要查看您的代码的简化版本。在你这样做之前:你是否在创建线程时保存它,然后在生成另一个线程之前测试线程是否已经创建?
-
我只是给出了代码的简化版本。 int main() { //一些代码做 { compute_distance(objects,clusters, &delta); // 带有 pthread 的例程 } while (delta > threshold ) void compute_distance(double *objects,double *clusters, double *delta) { //一些代码再次 //计算移动到一个单独的并行例程.. for (i =0, i
)&ip); for (i=0, i