优化线程级并行性- c



我目前正在编写一个人为的生产者/消费者程序,它使用有界缓冲区和许多工作线程来乘矩阵(为了说明)。在尝试确保程序的并发性达到最佳状态时,我观察到一些不寻常的行为。也就是说,当执行程序时,我只能达到100%的CPU使用率(在顶部观察到),尽管有6个核心。使用shift-i查看相对百分比将上限更改为~%16.7,我可以通过按1查看不同内核的使用情况时清楚地看到,要么只有一个内核完全最大化,要么一个内核的负载分布在所有六个内核中。

无论我运行什么压力测试(我尝试了压力程序和一个简单的压力测试,创建了多个旋转的线程),我都不能让单个进程使用超过100%(或相对于所有可用内核~%16.7)的CPU,所以我假设并行性绑定到单个内核。这一行为是在使用2.3 GHz 8核Intel酷睿i9处理器的Mac主机上运行VirtualBox的Ubuntu LTS 20.10上观察到的。我是否必须在VirtualBox中启用多核并行,或者这可能只是设置的特性?

作为参考,这里是我使用的简单压力测试


void *prod_worker(void *arg) {
while (1) {
printf("...");
}
}
int main (int argc, char * argv[])
{
printf("pid: %lunn", getpid());
getc(stdin);
int numw = atoi(argv[1]);
pthread_t *prod_threads = malloc(sizeof(pthread_t) * numw);
for (int i = 0; i < numw; i++) { 
pthread_t prod;
int rcp; 
rcp = pthread_create(&prod, NULL, prod_worker, NULL);
if (rcp == THREAD_CREATE_SUCCESS) { 
prod_threads[i] = prod;
} else {
printf("Failed to create producer and consumer thread #%d...n", i);
printf("Error codes: prod = %dn", rcp);
printf("Retrying...n");
i--;
}
}
for (int i = 0; i < numw; i++) {
pthread_join(prod_threads[i], NULL);
}
return 0;
}

printf是线程安全的,这通常意味着在stdout流上有某种互斥锁,这样一次只有一个线程可以打印。因此,即使你所有的线程都在"运行",在任何给定的时间,除了一个线程之外,所有的线程都可能在等待获得流的所有权,因此没有做任何有用的事情,也不使用CPU。

你可能想尝试一个线程做一些计算的测试,而不仅仅是I/o。

最新更新