c - 如何将线程分配给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;
}
解决方案
您没有,不想也不能(我不知道您是否可以)在如此低的级别上管理硬件资源。这是您的操作系统和部分标准库的工作:它们已经过适当的优化和标准化测试。
我怀疑你能做得更好。如果您按照您所说的去做,要么您是专业的硬件/操作系统程序员,要么您正在破坏数十年的作品:)。
还要考虑这个事实:如果您可以手动索引核心,您的代码将不再可移植,因为它取决于您机器的核心数量。
另一方面,即使只有一个内核,多线程程序也应该可以工作(有时甚至更好)。一个例子是其中一个线程在事件发生之前不做任何事情:您可以让一个线程进入“睡眠”状态,以便只有其他线程使用 CPU;然后当事件发生时它将执行。在非多线程程序中,通常使用轮询,它使用 CPU 资源什么都不做。
pthread_join
@yano 还说,在这种情况下,您的多线程程序并不是真正并行的,因为您正在创建线程,然后在启动其他线程之前等待它完成。