Multithreading Pthreads&;多核编译器
我正在使用支持SMP内核:Snapgear 2.6.21。 我在我的c应用程序中创建了4个线程,我正在尝试设置线程1在CPU 1上运行,线程2在CPU 2上运行,等等。 但是,编译器sparc linux gcc无法识别以下函数:Multithreading Pthreads&;多核编译器,multithreading,parallel-processing,linux-kernel,pthreads,embedded-linux,Multithreading,Parallel Processing,Linux Kernel,Pthreads,Embedded Linux,我正在使用支持SMP内核:Snapgear 2.6.21。 我在我的c应用程序中创建了4个线程,我正在尝试设置线程1在CPU 1上运行,线程2在CPU 2上运行,等等。 但是,编译器sparc linux gcc无法识别以下函数: CPU_SET (int cpu, cpu_set_t * set); CPU_ZERO (cpu_set_t * set); 这种类型:cpu\u set\t 它总是给我这些错误: implicit declaration of function 'CPU_ZER
CPU_SET (int cpu, cpu_set_t * set);
CPU_ZERO (cpu_set_t * set);
这种类型:cpu\u set\t
它总是给我这些错误:
implicit declaration of function 'CPU_ZERO'
implicit declaration of function 'CPU_SET'
'cpu_set_t' undeclared (first use in this function)
以下是将活动线程绑定到处理器0的代码:
cpu_set_t mask;
CPU_ZERO (& mask);
CPU_SET (0, & mask) // bind processor 0
sched_setaffinity (0, sizeof(mask), & mask);
我在顶部包括并定义了:
**define _GNU_SOURCE
include <sched.h>**
**定义GNU源代码
包括**
但我总是犯同样的错误。您能帮助我吗?您应该仔细阅读并测试其结果(并在出现故障时显示errno
,例如使用perror
)
事实上,我相信你应该改用(当然还要测试它的失败,等等…)
更重要的是,我认为您不应该费心显式地设置亲和性。最近的Linux内核通常非常擅长在不同的CPU上调度运行线程
所以只需使用pthreads,不必担心关联性,除非在基准测试时看到实际问题
顺便说一句,将-H
标志传递给(交叉)编译器可能会有所帮助。它会显示包含的文件。也许还可以查看使用gcc-C-E
获得的预处理表单;看起来有些头文件丢失或找不到(可能是编译时缺少的-I
include目录,或者是开发系统上缺少的头文件)
顺便说一句,你的版本看起来很古老。您不能将内核升级到更新的版本(3.15.x或3.y)吗?通过更好的格式编辑您的问题。在每行代码之间使用四个空格(代码块前后各有一个空行)。您应该测试
sched_setaffinity
的返回值,您可能会显示更多的源代码和编译命令。请随意编辑您的问题。@Mariem,使用任务集
或numactl
对您来说是一种可能的选择吗?您是否按照中的建议,在包含任何标题之前,确保在顶部包含#define"GNU"SOURCE?我也有同样的问题,这为我解决了。Linux的调度也可能非常糟糕——如果线程的负载不均匀,并且Linux确定它们基本上什么都不做,那么它可能会将线程分组到同一个核心上。这不是答案。这是一种糟糕的回应方式,基本上,阅读手册,你不应该这样做。如果人们在stackoverflow上发布问题,他们很可能有很好的理由去做他们所问的事情。如果你想推荐一个不同的行动方案而不是回答问题,那么请留下评论。这是一个答案,我将提供补充信息(特别是提示避免在没有充分理由的情况下关心亲和力),手册页不会给出太多