高性能计算pthread参数 - c ++

时间:2013-02-12 11:58:30

标签: c multithreading performance pthreads posix

我正在开发一个项目,我需要使用pthread(C ++)来使用多个线程。 我有一个问题:

什么是最好的pthread参数配置设置,当我想在该线程中进行一些高性能计算而没有太多其他线程中断它时?

目前我正在使用这样的东西:

pthread_t thread;

struct sched_param param;
int sched = SCHED_FIFO;
memset(&param, 0, sizeof(sched_param));

// Now I set priority to max value (sched_get_priority_max() returns that value)
param.sched_priority = sched_get_priority_max();

// Create my thread
pthread_create(&thread, NULL, (void *) &hard_number_crunching, (void *) &structure_passed_to_thread);

// finally I set parameters to thread
pthread_setschedparam(&thread, sched, &param);

我在SCHED_FIFO和SCHED_RR之间切换了“int sched”,但它对我帮助不大。 是否可以强制此线程在CPU上运行的时间比目前更长?

3 个答案:

答案 0 :(得分:2)

如果要为每个核心创建一个线程,则可能需要设置线程的亲缘关系以防止它在核心之间漫游。这通常通过确保每个线程保持接近其缓存数据来提高性能。见:

int sched_setaffinity(pid_t pid,size_t cpusetsize,cpu_set_t *mask);

注意:如果您创建的线程多于核心,则不应设置亲缘关系!这可能会导致所有类型的疯狂事件发生,死锁提一个。

答案 1 :(得分:0)

假设您的线程将采用X周期。无论优先级是什么,或者系统正在做什么,它仍然需要X周期。如果系统不忙于执行其他操作,则您的线程将几乎连续运行直到完成。如果系统繁忙,您的线程将被停止,甚至可能经常停止,让其他东西运行。最终你的线程仍将获得其X周期。请注意,出于此目的,有两种类型的优先级...线程优先级(一个线程的优先级与其他线程的优先级)和进程优先级(进程/程序的优先级与其他优先级的优先级)进程/程序/操作系统)。您正在设置线程优先级。你有其他同等或更高优先级的线程与这个竞争吗?是否有更高优先级的系统流程与您竞争?如果答案是否定的,那么你几乎可以获得自己的CPU。另请注意,如果您有多个处理器和/或内核,您的线程可能无法在多个处理器和/或内核上运行良好,因此如果您没有很好地分割任务,则整个系统处理可能不是100%。

答案 2 :(得分:0)

两个zr。并标记答案帮助了我。 我还找到了一种为单个线程设置亲和力的方法。 请查看此链接,了解如何:pthread_attr_setaffinity_np()

感谢所有帮助过的人。