在双四核GetProcessAffinityMask(或taskman.exe中"Set affinity"对话框)中将报告八个逻辑处理器.如何找出哪个逻辑处理器在哪个物理处理器上?特别是:哪些逻辑处理器在同一物理处理器上?
编辑:如果无法以编程方式执行此操作,是否有人只知道正常映射是什么?第一个处理器上的前四个是第二个处理器上的前四个,或者第一个处理器上的第四个是奇数还是第二个上的偶数?
(我问,因为它是在我学习操作系统的严重SMP和多核之前.我喜欢对代码的执行方式有所了解.)
如果我有一个多核x86 CPU直接启动到我的程序中.有人可以推荐一个网站来描述我必须控制亲和力的汇编程序命令吗?
有没有办法为Windows 7中所有正在运行的进程设置亲和力?
我想运行一些超线程基准测试,并且我想确保它们在某个核心上单独运行。我用包装器运行它们,我想做这样的事情(以伪代码):
foreach process in <list of all processes>
set affinity to all cores but core x
set affinity of the current process to core x
run benchmark 0 on core x thread 0
run benchmark 1 on core x thread 1
Run Code Online (Sandbox Code Playgroud)
现在,我认为我知道如何设置当前进程及其子进程的亲和力,但是我怎样才能:
可能重复:
CPU亲和力
我正在Linux上运行,我想编写一个C++程序,它将设置2个特定处理器,这两个处理器将并行运行(即设置每个进程在不同的核心/ CPU上运行).我想在C++中使用处理器关联工具.请任何人都可以帮助C++代码.
我有一个用C++编写的本机多线程Win32应用程序,它有大约3个相对繁忙的线程和4到6个线程,但没有那么多.当它以正常模式运行时,在8核计算机上总CPU使用率增加约15%,应用程序在大约30秒内完成.当我通过设置亲和力掩码将应用程序限制为仅一个核心时,0x01它在23秒内完成得更快.
我猜它与限制一个物理核心和/或某些并发内存访问问题时同步更便宜有关.
我正在运行Windows 7 x64,应用程序是32位.CPU是Xeon X5570,具有4个内核并启用了HT.
任何人都可以详细解释这种行为吗?为什么会发生这种情况以及如何提前预测这种行为?
更新:我想我的问题不是很清楚.我想知道为什么它在一个物理内核上变得更快,而不是为什么它在多个内核上没有超过15%.
非常直截了当的问题 - 有没有办法通过PHP设置CPU亲和力?以下任何一项都可以:
我到目前为止找到的唯一选项是最后一个,使用名为schedutils的工具,它似乎只能在更新的内核上支持.
我正在尝试按照'os.sched_getaffinity'方法检查我的脚本正在使用的内核数,如导入numpy后为什么多处理仅使用单个内核一样?。但是当我跑步时
import os
os.sched_getaffinity(0)
Run Code Online (Sandbox Code Playgroud)
我懂了
AttributeError
Traceback (most recent call last) <ipython-input-1-895d9c252fd1> in <module>()
1 import os
----> 2 os.sched_getaffinity(0)
AttributeError: module 'os' has no attribute 'sched_getaffinity'
Run Code Online (Sandbox Code Playgroud)
这是怎么了?来自“ os”模块的其他标准方法似乎可行。我正在使用Python 3.6.0运行Anaconda 4.3.0。我在Mac和Linux上都尝试过。还有其他检查和更改任务关联性的方法吗?
我试图了解 Java 内部关于它们的调度和线程关联性。
问题是:
给定一个无限循环,在多核环境(例如 8)中的线程上运行:
while(true) Thread.sleep(1000);
Run Code Online (Sandbox Code Playgroud)
这个操作是否总是在同一个物理线程上运行?
有什么缘分吗?
如果它并不总是在同一个 CPU 上运行,JVM 如何决定实际将执行切换到新的 CPU?
有什么方法可以验证这种行为?
如果我这样做:CreateThreads,setsched_affinity到CPU 0,那么所有线程是否也与CPU 0具有亲和力如果相反,我颠倒操作顺序,即先set_schedaffinity,然后创建线程,那么线程是否具有亲和力
我正在使用 pthreads 库创建线程。感谢您的任何答复
我需要在创建线程之前设置亲缘关系(线程到核心,例如:第一个线程到第一个核心).喜欢的东西KMP_AFFINITY在OpenMP.可能吗?
编辑:我试试这种方式,但不要工作:/
void* DoWork(void* args)
{
int nr = (int)args;
printf("W?tek: %d, ID: %d, CPU: %d\n", nr,pthread_self(), sched_getcpu());
}
int main()
{
int count = 8;
pthread_t threads[count];
pthread_attr_t attr;
cpu_set_t mask;
CPU_ZERO(&mask);
pthread_attr_init(&attr);
for (int i = 0; i < count ; i++)
CPU_SET(i, &mask);
pthread_attr_setaffinity_np(&attr, sizeof(cpu_set_t), &mask);
for(int i=0; i<count ; i++)
{
pthread_create(&threads[i], &attr, DoWork, (void*)i);
}
for(int i=0; i<count ; i++)
{
pthread_join(threads[i], NULL);
}
}
Run Code Online (Sandbox Code Playgroud) 我已经广泛研究了 TensorFlow 上的其他答案,但我似乎无法让它在我的 CPU 上使用多个内核。
根据 htop,以下程序仅使用单个 CPU 内核:
import tensorflow as tf
n_cpus = 20
sess = tf.Session(config=tf.ConfigProto(
device_count={ "CPU": n_cpus },
inter_op_parallelism_threads=n_cpus,
intra_op_parallelism_threads=1,
))
size = 100000
A = tf.ones([size, size], name="A")
B = tf.ones([size, size], name="B")
C = tf.ones([size, size], name="C")
with tf.device("/cpu:0"):
x = tf.matmul(A, B)
with tf.device("/cpu:1"):
y = tf.matmul(A, C)
sess.run([x, y])
# run_options = tf.RunOptions(trace_level=tf.RunOptions.FULL_TRACE)
# run_metadata = tf.RunMetadata()
# sess.run([x, y], options=run_options, run_metadata=run_metadata)
# for device in run_metadata.step_stats.dev_stats:
# device_name = device.device …Run Code Online (Sandbox Code Playgroud) python parallel-processing multithreading affinity tensorflow
我有1500个线程..我希望它们在12个处理器上运行...为此我打电话
SetThreadAffinityMask(GetCurrentThread(),1<<(threadnum%numprocessors)); 其中numprocessors = 12.这是正确使用面具吗?它需要是可扩展的,即如果我希望它只在11个处理器上运行,那么
SetThreadAffinityMask(GetCurrentThread(),1<<(threadnum%numprocessors));numprocessors = 11.
我正在开发一些具有可变数量线程的C++多核程序,我想知道如何设置一个合适的(实际上是"最好的")亲和力.我使用Boost-threads,所以我可以调用get_hardware_concurrency()来了解有多少逻辑内核.到目前为止,我写了一个映射"第n个线程到第n个逻辑核心",但由于多插槽处理器和超线程,它并不是最聪明的事情.我的程序总是像SIMD一样,所以线程之间没有任何共享,如果是HT计算机,我想以我能想象的最聪明的方式将线程绑定到逻辑核心:第一个物理上的第一个逻辑核心,第2个物理上的第1个逻辑,...,第1个物理上的第1个逻辑,第1个物理上的第2个逻辑,依此类推.
我发现了很多内容,讨论了如何发现HT是否启用(CPUID)以及如何确定逻辑和物理内核PER包.我知道我必须处理一些汇编代码,它并没有吓到我,但我真的找不到如何知道有关逻辑内核,物理内核和软件包的完整信息以及操作系统如何处理所有这些信息.
作为最简洁的我可以:我怎么知道OS(Windows和Linux)引用的线程的确切位置(物理核心和包)为N-th?