使用线程发现CPU内核的数量

使用线程发现CPU内核的数量,c,multithreading,cpu,C,Multithreading,Cpu,我有一个任务,我必须在Linux上用C编写一个程序(我使用CentOS),它使用线程/进程来确定CPU的内核数。 首先,我尝试以毫秒/微秒为单位打印当前时间,因为我知道可以运行1thread/core(或者使用HT运行2)。但到了毫秒,超过10条线的打印时间相同,到了微秒,没有一条是相同的。 其次,我试着用时钟测量线程的执行时间,因为我有4个内核,4个线程同时执行的时间应该差不多和执行1的时间一样长。但是我的程序都不能让我接近CPU的数量。 你能帮我提些建议吗 程序打印当前时间: pthread

我有一个任务,我必须在Linux上用C编写一个程序(我使用CentOS),它使用线程/进程来确定CPU的内核数。 首先,我尝试以毫秒/微秒为单位打印当前时间,因为我知道可以运行1thread/core(或者使用HT运行2)。但到了毫秒,超过10条线的打印时间相同,到了微秒,没有一条是相同的。 其次,我试着用时钟测量线程的执行时间,因为我有4个内核,4个线程同时执行的时间应该差不多和执行1的时间一样长。但是我的程序都不能让我接近CPU的数量。 你能帮我提些建议吗

程序打印当前时间:

pthread_t th[N];     

void* afis ()
{
    //time_t now;
    //time(&now);
    //printf("%s", ctime(&now));
    struct timeval start, end;
    long mtime, seconds, useconds;    

    gettimeofday(&start, NULL);
    // usleep(2000);
    gettimeofday(&end, NULL);

    seconds  = end.tv_sec  - start.tv_sec;
    useconds = end.tv_usec - start.tv_usec;

    mtime = seconds + useconds;

    printf("Thread with TID:%d   Elapsed time: %ld microsecons\n",(unsigned int)pthread_self(), mtime);
}     

int main()
{
    int i;
    for (i=0;i<N;i++)
    {
        pthread_create(&th[i],NULL,afis,NULL);
    }
    for(i=0;i<N;i++)
    {
        pthread_join(th[i],NULL);
    }
    return 0;
}
pthread_t th[N];
void*afis()
{
//现在是时候了;
//时间(现在);
//printf(“%s”,ctime(&now));
结构timeval开始、结束;
长时间,秒,秒;
gettimeofday(&start,NULL);
//usleep(2000年);
gettimeofday(&end,NULL);
秒=end.tv_秒-start.tv_秒;
useconds=end.tv\u usec-start.tv\u usec;
mtime=秒+秒;
printf(“TID为%d的线程运行时间:%ld微秒\n”,(unsigned int)pthread_self(),mtime);
}     
int main()
{
int i;
对于(i=0;i
#包括
内核的整数=sysconf(\u SC\u NPROCESSORS\u ONLN);
这是不可移植的,仅适用于Linux afaik。

\include
内核的整数=sysconf(\u SC\u NPROCESSORS\u ONLN);

这是不可移植的,仅适用于Linux afaik。

您可能应该做的是(在伪代码中):

获取实际时间(开始时间)
开始40个线程
每个人忙了一秒钟;
等他们都停下来
获取实际时间(停止时间)
如果分析40个线程执行所需的时间,您将知道内核的数量,或者至少可以做出一个假设:

如果时间在40秒左右:您有一个核心
如果时间是20秒左右:你有两个
等等
当然,您可以调整启动线程的数量,以及让线程睡眠的时间,但我想,如果您只睡眠一毫秒,由于上下文切换和后台任务,您可能会得到不具有代表性的时间


不要在线程中睡觉,而是执行以下操作:

highlycpu任务()
{
//计算占用时间x的某个值(最好在1秒以上)
}
在不启动线程的情况下执行一次,将占用时间
x
。该时间将是参考时间


如果,通过添加越来越多的
pthread
s(
y
),执行相同的函数时,您不会比
x
占用更多的时间,那么您知道您很可能至少拥有
y
内核。在某个点上,使用
z
线程时,时间大约为
2x
,此时您将知道您拥有
z-1
内核。

您可能应该做什么do is(在伪代码中):

获取实际时间(开始时间)
开始40个线程
每个人忙了一秒钟;
等他们都停下来
获取实际时间(停止时间)
如果分析40个线程执行所需的时间,您将知道内核的数量,或者至少可以做出一个假设:

如果时间在40秒左右:您有一个核心
如果时间是20秒左右:你有两个
等等
当然,您可以调整启动线程的数量,以及让线程睡眠的时间,但我想,如果您只睡眠一毫秒,由于上下文切换和后台任务,您可能会得到不具有代表性的时间


不要在线程中睡觉,而是执行以下操作:

highlycpu任务()
{
//计算占用时间x的某个值(最好在1秒以上)
}
在不启动线程的情况下执行一次,将占用时间
x
。该时间将是参考时间


如果,通过添加越来越多的
pthread
s(
y
),执行相同的函数时,您不会比
x
占用更多的时间,那么您知道您很可能至少拥有
y
内核。在某个时刻,使用
z
线程,时间大约为
2x
,此时您将知道您拥有
z-1
内核。

感谢您的帮助,但请不要这样做问题是我不允许以任何形式询问处理器,我需要使用线程/进程来确定它感谢您的帮助,但问题是我不允许以任何形式询问处理器,我需要使用线程/进程来确定它,我如何才能等待所有线程完成?如果我使用互斥锁,那么只有1次d将能够一次访问该函数,如果有4个内核,那么4个线程应该可以同时访问它??我预计无论启动多少个线程,即使是在单核系统上,所需的时间都是~1秒。@MartinJames你完全正确,当然需要忙着等待。我的错。使用“执行高度并行计算并测量其加速比”是一个相当普遍的概念,当然人们可以用这些周期来做一些有趣的(甚至可能有用的)并行性问题,而不是忙着等待。谢谢你的帮助。我解决了创建一个函数检查一个数字是否为1到100k的素数的问题(首先是1个线程,然后是2个线程,依此类推)。我用“时间。/来自linux命令行的程序。因此我可以确定我的CPU运行在多少个内核上。我如何等待所有线程完成?如果我使用互斥锁,那么一次只能有一个线程访问该函数,并且有4个内核,4个线程可以一次访问该函数??我预计所需的时间为~1秒,无论启动多少线程,即使是在单个内核上
pthread_t th[N];    

void* func(void* arg)
{
    int x;
    int k;
    int n=(int)arg;
    for(k=0;k<10000000;k+=n)
    {
        x=0;
    }
}


int main()
{
    int i,j;
    for (i=0;i<N;i++)
    {
        clock_t start, end, total;
        start=clock();
        for(j=0;j<i;j++)
        {
            printf("execution nr: %d\n",i);
            pthread_create(&th[j],NULL,func,(int*)i);
        }
        for(j=0;j<i;j++)
        {
            pthread_join(th[j],NULL);
        }
        end=clock();
        printf("start = %ld, end = %ld\n", start, end);
        total=((double)(end-start) )/ CLOCKS_PER_SEC;
        printf("total=%ld\n",total);
    }

    return 0;
}
#include <unistd.h>

int number_of_cores = sysconf(_SC_NPROCESSORS_ONLN);