Manpages

名 前

pthread_setaffinity_np, pthread_getaffinity_np − ス レ ッ ド の CPU affinity の 設 定 /取 得 を 行 う

書 式

#define _GNU_SOURCE /* See feature_test_macros(7) */
#include <pthread.h>

int pthread_setaffinity_np(pthread_t thread, size_t cpusetsize,
const cpu_set_t *
cpuset);
int pthread_getaffinity_np(pthread_t
thread, size_t cpusetsize,
cpu_set_t *
cpuset);

−pthread で コ ン パ イ ル し て リ ン ク す る 。

説 明

pthread_setaffinity_np() 関 数 は 、 ス レ ッ ド thread の CPU affinity マ ス ク に cpuset が 指 す CPU 集 合 を 設 定 す る 。 呼 び 出 し が 成 功 し 、 そ の ス レ ッ ド が 現 在 cpuset で 指 定 さ れ た CPU 上 で が 実 行 さ れ て い な い 場 合 は 、 ス レ ッ ド は 指 定 さ れ た CPU の い ず れ か に 移 動 さ れ る 。

pthread_getaffinity_np() 関 数 は 、 ス レ ッ ド thread の CPU affinity マ ス ク を 、 cpuset が 指 す バ ッ フ ァ ー に 入 れ て 返 す 。

CPU affinity マ ス ク の 詳 細 に つ い て は 、 sched_setaffinity(2) を 参 照 し て ほ し い 。 CPU 集 合 の 操 作 や 取 得 を 行 う 際 に 利 用 で き る マ ク ロ 群 の 説 明 は CPU_SET(3) を 参 照 し て ほ し い 。 引 き 数 cpusetsizecpuset が 指 す バ ッ フ ァ ー の 長 さ (バ イ ト 単 位 ) で あ る 。 通 常 は 、 こ の 引 き 数 に は sizeof(cpu_set_t) を 指 定 す る (CPU_SET(3) に 書 か れ て い る マ ク ロ を 使 っ て CPU 集 合 を 動 的 に 割 り 当 て て い る 場 合 に は 、 別 の 値 に な る こ と も あ る )。

返 り 値

成 功 す る と 、 こ れ ら の 関 数 は 0 を 返 す 。 エ ラ ー の 場 合 、 0 以 外 の エ ラ ー 番 号 を 返 す 。

エ ラ ー

EFAULT 指 定 さ れ た メ モ リ ー ア ド レ ス が 無 効 で あ る 。

EINVAL

(pthread_setaffinity_np()) affinity ビ ッ ト マ ス ク mask に 、 そ の 時 点 で シ ス テ ム 上 に 物 理 的 に 存 在 し て 、 か つ そ の ス レ ッ ド に 対 し て 許 可 さ れ て い る プ ロ セ ッ サ が 一 つ も 含 ま れ て い な い 。 ス レ ッ ド に 対 し て ど の プ ロ セ ッ サ の 利 用 が 許 可 さ れ る か は 、 cpuset(7) で 説 明 さ れ て い る "cpuset" 機 構 に 適 用 さ れ る 制 限 に 基 づ い て 決 ま る 。

EINVAL

(pthread_setaffinity_np()) cpuset が 、 カ ー ネ ル が サ ポ ー ト す る CPU 集 合 に 含 ま れ な い CPU を 指 定 し て い た 。 (カ ー ネ ル の 設 定 オ プ シ ョ ン CONFIG_NR_CPUS に よ り 、 CPU 集 合 を 表 現 す る の に 使 わ れ る カ ー ネ ル の デ ー タ 型 が サ ポ ー ト す る CPU 集 合 の 範 囲 が 定 義 さ れ る 。 )

EINVAL

(pthread_getaffinity_np()) cpusetsize が カ ー ネ ル が 使 用 す る affinity マ ス ク の 大 き さ よ り も 小 さ い 。

ESRCH

ID が thread の ス レ ッ ド が 見 つ か ら な か っ た 。

バ ー ジ ョ ン

こ れ ら の 関 数 は glibc バ ー ジ ョ ン 2.3.4 以 降 で 提 供 さ れ て い る 。

属 性

マ ル チ ス レ ッ デ ィ ン グ (pthreads(7) 参 照 ) 関 数 pthread_setaffinity_np() と pthread_getaffinity_np() は ス レ ッ ド セ ー フ で あ る 。

準 拠

こ れ ら の 関 数 は 非 標 準 の GNU に よ る 拡 張 で あ る 。 そ の た め 、 名 前 に "_np" (nonportable; 移 植 性 が な い ) と い う 接 尾 辞 が 付 い て い る 。

注 意

pthread_setaffinity_np() を 呼 び 出 し た 後 、 そ の ス レ ッ ド が 実 際 に 実 行 さ れ る CPU 集 合 は 、 cpuset 引 き 数 で 指 定 さ れ た 集 合 と シ ス テ ム に 実 際 に 存 在 す る CPU 集 合 の 共 通 部 分 に な る 。 ま た 、 cpuset(7) で 説 明 さ れ て い る "cpuset" 機 構 が 使 わ れ て い る 場 合 に は 、 そ の ス レ ッ ド が 実 行 さ れ る CPU 集 合 が シ ス テ ム に よ っ て さ ら に 制 限 さ れ る 場 合 が あ る 。 そ の ス レ ッ ド が 実 行 さ れ る 実 際 の CPU 集 合 に 対 す る こ れ ら の 制 限 は 、 カ ー ネ ル に よ り 黙 っ て 適 用 さ れ る 。 こ れ ら の 関 数 は 、 シ ス テ ム コ ー ル sched_setaffinity(2)sched_getaffinity(2) を 使 っ て 実 装 さ れ て い る 。

(こ の バ ー ジ ョ ン だ け で あ る が ) glibc 2.3.3 で は 、 こ れ ら の 関 数 は cpusetsize 引 き 数 を 持 っ て い な か っ た 。 内 部 で 呼 ば れ る シ ス テ ム コ ー ル に 渡 さ れ る CPU セ ッ ト の 大 き さ は 常 に sizeof(cpu_set_t) で あ っ た 。

pthread_create(3) で 作 成 さ れ る 新 し い ス レ ッ ド は 、 作 成 者 の CPU affinity マ ス ク を 継 承 す る 。

以 下 の プ ロ グ ラ ム で は 、 メ イ ン ス レ ッ ド は pthread_setaffinity_np() を 使 っ て 自 分 の CPU affinity マ ス ク に CPU 0 か ら 7 が 含 ま れ る よ う に 設 定 し (シ ス テ ム 上 に は 0 か ら 7 に 対 応 す る CPU が 全 て 存 在 す る と は 限 ら な い )、 そ の 後 で pthread_getaffinity_np() を 使 っ て ス レ ッ ド に 実 際 に 設 定 さ れ た CPU affinity マ ス ク を 確 認 し て い る 。

#define _GNU_SOURCE
#include <pthread.h>
#include <stdio.h>
#include <stdlib.h>
#include <errno.h>

#define handle_error_en(en, msg) \
do { errno = en; perror(msg); exit(EXIT_FAILURE); } while (0)

int
main(int argc, char *argv[])
{
int s, j;
cpu_set_t cpuset;
pthread_t thread;

thread = pthread_self();

/* Set affinity mask to include CPUs 0 to 7 */

CPU_ZERO(&cpuset);
for (j = 0; j < 8; j++)
CPU_SET(j, &cpuset);

s = pthread_setaffinity_np(thread, sizeof(cpu_set_t), &cpuset);
if (s != 0)
handle_error_en(s, "pthread_setaffinity_np");

/* Check the actual affinity mask assigned to the thread */

s = pthread_getaffinity_np(thread, sizeof(cpu_set_t), &cpuset);
if (s != 0)
handle_error_en(s, "pthread_getaffinity_np");

printf("Set returned by pthread_getaffinity_np() contained:\n");
for (j = 0; j < CPU_SETSIZE; j++)
if (CPU_ISSET(j, &cpuset))
printf(" CPU %d\n", j);

exit(EXIT_SUCCESS); }

関 連 項 目

sched_setaffinity(2), pthread_attr_setaffinity_np(3), pthread_self(3), sched_getcpu(3), cpuset(7), pthreads(7), sched(7)

こ の 文 書 に つ い て

こ の man ペ ー ジ は Linux man−pages プ ロ ジ ェ ク ト の リ リ ー ス 3.79 の 一 部 で あ る 。 プ ロ ジ ェ ク ト の 説 明 と バ グ 報 告 に 関 す る 情 報 は http://www.kernel.org/doc/man−pages/ に 書 か れ て い る 。