У меня есть приложение, которое распараллелено с использованием pthreads. Приложение имеет итеративный вызов подпрограммы и порождает поток в рутину (pthread_create и pthread_join), чтобы распараллелить интенсивный раздел вычислений в подпрограмме Когда я использую инструментальные средства, такие как ПИН, для сбора статистики, инструмент сообщает статистику по нескольким потокам (нет потоков, нет итераций). Я полагаю, это потому, что он порождает новый набор потоков каждый раз, когда вызывается подпрограмма.
Как я могу гарантировать, что я создаю поток только один раз, и все последующие вызовы используют потоки, которые были созданы первыми.
Когда я делаю то же самое с OpenMP, а затем пытаюсь собрать статистику, я вижу, что потоки создаются только один раз. Это из-за времени выполнения OpenMP?
EDIT:
я даю упрощенную версию кода.
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);
}
Надеюсь, это ясно объясняет проблему.
- Как сохранить идентификатор потока и проверить, был ли он уже создан?