gpt4 book ai didi

c - 替代 shed_getaffinity、cpu_set_t 等?

转载 作者:太空宇宙 更新时间:2023-11-04 04:22:28 24 4
gpt4 key购买 nike

所以我对这类事情一窍不通。

我正在努力在 macOS 上编译一个气候模型,我已经将它归结为这里发生的事情:

#define _GNU_SOURCE

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <unistd.h>
#include <sched.h>
#include <errno.h>
#include <sys/resource.h>
#include <sys/syscall.h>

static pid_t gettid(void)
{
return syscall(__NR_gettid);
}

/*
* Returns this thread's CPU affinity, if bound to a single core,
* or else -1.




*/
int get_cpu_affinity(void)
{
cpu_set_t coremask; /* core affinity mask */

CPU_ZERO(&coremask);
if (sched_getaffinity(gettid(),sizeof(cpu_set_t),&coremask) != 0) {
fprintf(stderr,"Unable to get thread %d affinity.

%s\n",gettid(),strerror(errno));
}

int cpu;
int first_cpu = -1; /* first CPU in range */
int last_cpu = -1; /* last CPU in range */
for (cpu=0;cpu < CPU_SETSIZE;cpu++) {
if (CPU_ISSET(cpu,&coremask)) {
if (first_cpu == -1) {
first_cpu = cpu;
} else {
last_cpu = cpu;
}
}
}

return (last_cpu == -1) ? first_cpu : -1;

}

int get_cpu_affinity_(void) { return get_cpu_affinity(); } /* Fortran interface */


/*
* Set CPU affinity to one core.
*/

void set_cpu_affinity( int cpu )
{
cpu_set_t coremask; /* core affinity mask */

CPU_ZERO(&coremask);
CPU_SET(cpu,&coremask);
if (sched_setaffinity(gettid(),sizeof(cpu_set_t),&coremask) != 0) {
fprintf(stderr,"Unable to set thread %d affinity. %s\n",gettid(),strerror(errno));

}
}

void set_cpu_affinity_(int *cpu) { set_cpu_affinity(*cpu); } /* Fortran interface */

编译时出现了一些错误:

第一个 - 标识符“cpu_set_t”未定义,第二个 - 标识符“CPU_SETSIZE”未定义

我进行了谷歌搜索,在我看来,sched_getaffinitiy()、cpu_set_t 和其他一些东西在 macOS 中似乎不存在。

对于各种 C 编程,我真的是力不从心。我想知道这里是否有人知道为 macOS 执行此操作的替代方法以及我如何去做。

我在下面附上了完整的错误报告。

亲切的问候,

尼尔:)

完整的错误报告:

(python2) salvare:MASTERS Neil$ python run.py
Working directory for exp 'playground' already exists
RRTM compilation disabled. Namelist set to gray radiation.
Writing path_names to '/Users/Neil/MASTERS/ISCA_TEMP/playground/path_names'
Running compiler
/Users/Neil/MASTERS/ISCA_TEMP/playground/compile.sh: line 21: module: command not found
loadmodules
/Users/Neil/MASTERS/Isca/src/extra/loadmodule: line 3: module: command not found
/Users/Neil/MASTERS/Isca/src/extra/loadmodule: line 4: module: command not found
/Users/Neil/MASTERS/Isca/src/extra/loadmodule: line 5: module: command not found
/Users/Neil/MASTERS/Isca/src/extra/loadmodule: line 6: module: command not found
/Users/Neil/MASTERS/ISCA_TEMP/playground/compile.sh: line 23: module: command not found
/Users/Neil/MASTERS/ISCA_TEMP/playground/compile.sh: line 24: ulimit: stack size: cannot modify limit: Operation not permitted
./compile_mppn.sh: line 13: module: command not found
./compile_mppn.sh: line 14: module: command not found
./compile_mppn.sh: line 15: module: command not found
- mppnccombine.c:162:24: warning: format string is not a string literal (potentially insecure) [-Wformat-security]
sprintf(outfilename,argv[outputarg]); outlen=strlen(outfilename);
^~~~~~~~~~~~~~~
/usr/include/secure/_stdio.h:47:56: note: expanded from macro 'sprintf'
__builtin___sprintf_chk (str, 0, __darwin_obsz(str), __VA_ARGS__)
^~~~~~~~~~~
mppnccombine.c:162:24: note: treat the string as an argument to avoid this
sprintf(outfilename,argv[outputarg]); outlen=strlen(outfilename);
^
"%s",
/usr/include/secure/_stdio.h:47:56: note: expanded from macro 'sprintf'
__builtin___sprintf_chk (str, 0, __darwin_obsz(str), __VA_ARGS__)
^
1 warning generated.
ln: /Users/Neil/MASTERS/ISCA_TEMP/playground/exec/mppnccombine.x: File exists
Makefile is ready.
mpicc -Duse_libMPI -Duse_netCDF -Duse_LARGEFILE -DINTERNAL_FILE_NML -DOVERLOAD_C8 -DRRTM_NO_COMPILE -I/usr/local/include -D__IFC -c /Users/Neil/MASTERS/Isca/src/shared/mpp/affinity.c
......................................................................................................................../Users/Neil/MASTERS/Isca/src/shared/mpp/affinity.c(35): error: identifier "__NR_gettid" is undefined
eturn syscall(__NR_gettid);
^
/Users/Neil/MASTERS/Isca/src/shared/mpp/affinity.c(44): error: identifier "cpu_set_t" is undefined
cpu_set_t coremask; /* core affinity mask */
^
/Users/Neil/MASTERS/Isca/src/shared/mpp/affinity.c(47): error: identifier "cpu_set_t" is undefined
if (sched_getaffinity(gettid(),sizeof(cpu_set_t),&coremask) != 0) {
^
/Users/Neil/MASTERS/Isca/src/shared/mpp/affinity.c(54): error: identifier "CPU_SETSIZE" is undefined
for (cpu=0;cpu < CPU_SETSIZE;cpu++) {
^
/Users/Neil/MASTERS/Isca/src/shared/mpp/affinity.c(75): error: identifier "cpu_set_t" is undefined
cpu_set_t coremask; /* core affinity mask */
^
/Users/Neil/MASTERS/Isca/src/shared/mpp/affinity.c(79): error: identifier "cpu_set_t" is undefined
if (sched_setaffinity(gettid(),sizeof(cpu_set_t),&coremask) != 0) {
^
compilation aborted for /Users/Neil/MASTERS/Isca/src/shared/mpp/affinity.c (code 2)
make: *** [affinity.o] Error 2
ERROR: mkmf failed for fms_moist
CRITICAL - Compilation failed.
Traceback (most recent call last):
File "run.py", line 25, in <module>
exp.compile()
File "/Users/Neil/MASTERS/Isca/src/extra/python/gfdl/experiment.py", line 298, in compile
raise e
sh.ErrorReturnCode_1:

RAN: /bin/bash /Users/Neil/MASTERS/ISCA_TEMP/playground/compile.sh

STDOUT:


STDERR:

最佳答案

您的谷歌搜索让您走上了正确的轨道 - sched_getaffinity()cpu_set_t它使用的结构是特定于 linux 的,并非在所有平台上都可用。尤其是 Mac OSX 似乎缺少它们。

但是,还有其他选择。我找到了 a blog post from someone porting code to OSX谁找到了使用 sysctlbyname() 的替代方案.该站点上的代码重新实现了 sched_getaffinity()在 Mac OSX 上通过请求 machdep.cpu.core_count ,并用它来构建自己的 cpu_set_t 版本.

关于c - 替代 shed_getaffinity、cpu_set_t 等?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45227009/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com