c - 如何将线程分配给C中的不同内核?

标签 c pthreads

我创建了一个程序,该程序使用 4 个线程对 8 个数字进行加法运算,然后计算结果的乘积。如何确保每个线程都使用单独的内核以获得最大的性能提升。我是 pthreads 的新手,所以我真的不知道如何正确使用它。请提供尽可能简单的答案。

我的代码:

#include <stdio.h>
#include <stdlib.h>
#include <pthread.h>
int global[9];
void *sum_thread(void *arg)
{
    int *args_array;
    args_array = arg;
    int n1,n2,sum;
    n1=args_array[0];
    n2=args_array[1];
    sum = n1*n2;

    printf("N1 * N2 = %d\n",sum);
    return (void*) sum;
}
void *sum_thread1(void *arg)
{
    int *args_array;
    args_array = arg;
    int n3,n4,sum2;
    n3=args_array[2];
    n4=args_array[3];
    sum2=n3*n4;
    printf("N3 * N4 = %d\n",sum2);
    return (void*) sum2;
}
void *sum_thread2(void *arg)
{
    int *args_array;
    args_array = arg;
    int n5,n6,sum3;
    n5=args_array[4];
    n6=args_array[5];
    sum3=n5*n6;
    printf("N5 * N6 = %d\n",sum3);
    return (void*) sum3;
}
void *sum_thread3(void *arg)
{
    int *args_array;
    args_array = arg;
    int n8,n7,sum4;
    n7=args_array[6];
    n8=args_array[7];
    sum4=n7*n8;
    printf("N7 * N8 = %d\n",sum4);
    return (void*) sum4;
}
int main()
{
    int sum3,sum2,sum,sum4;
    int prod;
    global[0]=9220; global[1]=1110; global[2]=1120; global[3]=2320; global[4]=5100; global[5]=6720; global[6]=7800; global[7]=9290;// the input
    pthread_t tid_sum;
    pthread_create(&tid_sum,NULL,sum_thread,global);
    pthread_join(tid_sum,(void*)&sum);
    pthread_t tid_sum1;
    pthread_create(&tid_sum1,NULL,sum_thread1,global);
    pthread_join(tid_sum1,(void*)&sum2);
    pthread_t tid_sum2;
    pthread_create(&tid_sum2,NULL,sum_thread2,global);
    pthread_join(tid_sum2,(void*)&sum3);
    pthread_t tid_sum3;
    pthread_create(&tid_sum3,NULL,sum_thread3,global);
    pthread_join(tid_sum3,(void*)&sum4);
    prod=sum+sum2+sum3+sum4;
    printf("The sum of the products is: %d", prod);
    return 0;
}

最佳答案

您没有、不想也不能(我不知道您是否可以)在如此低的级别上管理硬件资源。这是您的操作系统的工作,部分是标准库的工作:它们已经过适当优化和标准化测试。

我怀疑你能做得更好。如果你按照你所说的去做,要么你是专业的硬件/操作系统程序员,要么你正在毁掉几十年的作品:)。

还要考虑这个事实:如果您可以手动索引核心,您的代码将不再具有可移植性,因为它取决于您机器的核心数量。

另一方面,即使只有一个内核,多线程程序也应该可以工作(有时甚至更好)。一个例子是其中一个线程在事件发生之前不做任何事情的情况:您可以让一个线程进入“ sleep ”状态,以便只有其他线程使用 CPU;然后当事件发生时它会执行。在非多线程程序中,通常使用轮询,它占用 CPU 资源什么都不做。

@yano 还说你是多线程程序,在这种情况下并不是真正的并行,因为你正在创建线程,然后在启动其他线程之前等待它用 pthread_join 完成。

关于c - 如何将线程分配给C中的不同内核?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53542815/

相关文章:

c++ - 使用 packaged_task 和线程的可能数据竞争

c - 得到错误的答案使用线程安全计数器

c - 我试图将随机整数分配给结构成员,但它无法正常工作

c - 数组指针的地址,&array

C中的坐标系作为数组

将 "pointer to const"转换为 "pointer to const VLA"

c++ - 在特定时间后唤醒线程

c++ - 同步屏幕 I/O & pthread & C++

c - 将参数传递给线程但得到的结果与预期完全不同

使用 pthreads 的 PHP 多线程,类未加载到 Thread 实例中