首页 > 解决方案 > 如何将线程分配给C中的不同核心?

问题描述

我创建了一个程序,它使用 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;
}

标签: cpthreads

解决方案


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

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

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

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

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


推荐阅读