C中pthreads线程函数的计时问题

C中pthreads线程函数的计时问题,c,pthreads,time.h,C,Pthreads,Time.h,因此,我在计算每个线程的线程函数的运行时间时遇到了一个问题,我需要能够找到所有线程的总运行时间,但它没有正确执行。(参见下面的输出代码) 正如您所看到的,无论出于什么原因,实际上只有一些线程返回时间。我多次运行这个程序,每次只有几个线程返回一个结果。正如仅供参考,gnolock是我的变量,用于存储经过的总时间。我猜这不起作用的原因是小数点超出了范围,但不应该超出范围?最可能的原因是,对于您试图测量的时间来说,您的时钟滴答声太粗。大多数起止时钟是相同的。偶尔,在线程执行过程中会出现时钟滴答声,您会

因此,我在计算每个线程的线程函数的运行时间时遇到了一个问题,我需要能够找到所有线程的总运行时间,但它没有正确执行。(参见下面的输出代码)


正如您所看到的,无论出于什么原因,实际上只有一些线程返回时间。我多次运行这个程序,每次只有几个线程返回一个结果。正如仅供参考,gnolock是我的变量,用于存储经过的总时间。我猜这不起作用的原因是小数点超出了范围,但不应该超出范围?

最可能的原因是,对于您试图测量的时间来说,您的时钟滴答声太粗。大多数起止时钟是相同的。偶尔,在线程执行过程中会出现时钟滴答声,您会看到1滴答声。(这实际上就是迪特里希上面所说的)

作为这意味着什么的一个例子,想象你的线程需要一个小时才能完成,你的时钟每天在午夜滴答响一次。大多数情况下,当您运行线程时,线程在同一天开始和结束。但是,如果您恰好在午夜的一个小时内运行它,您将在不同的日子看到开始和停止(1滴答)。然后,您需要一个更快的时钟,但这样的时钟可能不可用。

如果您在系统上调用
clock()
,它的分辨率为10毫秒。因此,如果一个进程需要2毫秒,那么它通常会报告0.00秒或0.01秒的时间,这取决于您无法控制的一系列事情

请改用一个高分辨率时钟。您可以使用
clock\u gettime
clock\u THREAD\u CPUTIME\u ID
clock\u PROCESS\u CPUTIME\u ID
,我相信这个时钟的分辨率比
clock()
好几个数量级


有关详细信息,请参见《手动2时钟获取时间》。

您使用了错误的工具<代码>时钟不测量经过的时间,但

函数的作用是:返回所用处理器时间的近似值 通过程序


这是两件完全不同的事情。可能您的线程没有占用太多处理器时间。

看起来您遇到了时钟分辨率问题。这是什么操作系统?(什么内核+版本号+体系结构)这将使事情变得复杂,但是,我是SSH到一个comal集群中的,我如何才能为您获取这些信息?有办法从终点站拿到吗?谁知道呢?我不知道“comal群集”是什么,它运行的是什么操作系统,等等。Linux comal.cs.tcu.edu 2.6.32-220.13.1.el6.x86\u 64\u 64\u 1 SMP周二4月17日23:56:34英国夏令时2012 x86\u 64 x86\u 64 GNU/Linux我如何解决/修复这个问题?有没有其他方法是应该尝试使用的?我不知道你是否可以。我认为时钟滴答声是最好的分辨率,但其他人会更清楚。另一个选择是,如果您只是在进行实验,则将经过的时间变大(例如循环)。为什么需要测量经过的时间?我所做的是测量不同临界段锁定方法之间的时间差,以确定哪种方法最适合使用,我想知道完成整个过程需要多长时间。我应该把开始放在创建for循环之前,把停止放在连接循环之后吗?@StraightEdge:你做错了。当您测量多线程系统的性能时,您可能应该测量墙时间而不是CPU时间。@DietrichEpp那么我如何测量墙时间呢?我知道如何使用wtime在MPI中实现这一点……但是如何使用pthreads实现这一点呢?
#include <unistd.h>
#include <sys/types.h>
#include <errno.h>
#include <stdio.h>
#include <stdlib.h>
#include <pthread.h>
#include <string.h>
#include <math.h>
#include <time.h>

int numthread;
double x1;
double x2;
double h; 
double totalintegral;
int n;              //number of trapezoids
int localn;

double gnolock;
double gmute;
double gbusy;
double gsema;

double doTrapRule(double localx1, double localx2, double h, int localn);
double doFunction(double x);
void *threadCalc(void* threadid);

int main(int argc, char * argv[])
{
    int i;
    x1 = 0.0;
    x2 = 20.0;
    n = 200000;

    numthread = 10;

    pthread_t* threads = malloc(numthread*sizeof(pthread_t));

    h = (x2 - x1)/n;
    localn = n/numthread;

    for(i = 0; i < numthread; i++)
    {
        pthread_create(&threads[i], NULL, (void *) &threadCalc, (void*) i);
    }

    for(i = 0; i < numthread; i++)
    {
        pthread_join(threads[i], NULL);
    }

    printf("Trap rule result with %d trap(s) is %f\n", n, totalintegral);
    fflush(stdout);
    printf("no lock completed in %f\n", gnolock);
    exit(0);
}

void *threadCalc(void* threadid)
{
    clock_t start = clock();
    double localx1;
    double localx2; 
    double localintegral;
    int cur_thread = (int)threadid;

    localx1 = x1 + cur_thread * localn * h;
    localx2 = localx1 + localn * h;

    localintegral = doTrapRule(localx1, localx2, h, localn);

    totalintegral = totalintegral + localintegral;
    //printf("Trap rule result with %d trap(s) is %f", n, totalintegral);
    clock_t stop = clock();
    double time_elapsed = (long double)(stop - start)/CLOCKS_PER_SEC;
    printf("time elapsed of each thread %f\n",time_elapsed);
    gnolock = gnolock + time_elapsed;
    return NULL;
}


double doTrapRule(double localx1, double localx2, double h, int localn)
{
    //time start here
    double localtrapintegral;
    double tempx1;
    int i;

    localtrapintegral = (doFunction(localx1) + doFunction(localx2)) / 2.0;

    for(i = 1; i <= (localn - 1); i++)
    {
        tempx1 = localx1 + i * h;
        localtrapintegral = localtrapintegral + doFunction(tempx1);
    }

    localtrapintegral = localtrapintegral * h;
    //time end here, add elapsed to global
    return localtrapintegral;
}

double doFunction(double x)
{
    double result;
    result = x*x*x;

    return result;
}
time elapsed of each thread 0.000000
time elapsed of each thread 0.000000
time elapsed of each thread 0.000000
time elapsed of each thread 0.000000
time elapsed of each thread 0.000000
time elapsed of each thread 0.000000
time elapsed of each thread 0.010000
time elapsed of each thread 0.010000
time elapsed of each thread 0.000000
time elapsed of each thread 0.000000
Trap rule result with 200000 trap(s) is 40000.000001
no lock completed in 0.020000