2

我正在做一个项目,我需要使用 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 上运行比现在更长的时间?

4

3 回答 3

2

如果您为每个内核创建一个线程,您可能希望设置线程的亲和性以防止它在内核之间漫游。这通常通过确保每个线程保持接近其缓存数据来提高性能。看:

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

注意:如果您创建的线程多于核心,则不应设置关联!这可能会导致各种疯狂的事情发生,比如死锁。

于 2013-02-12T13:56:46.113 回答
0

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

于 2013-02-12T12:56:11.630 回答
0

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

感谢所有帮助过的人。

于 2013-02-13T08:05:46.937 回答