Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/124.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何在C+中基于拓扑考虑在多核HT上实现亲和性+;节目? 我正在开发一些具有多个线程的C++多核程序,我想知道如何设置一个适当的(实际上是最好的)亲和力。我使用Boost线程,所以我可以调用get_hardware_concurrency()来了解有多少逻辑核。到目前为止,我编写了一个映射“第n个线程到第n个逻辑核”,但由于多套接字处理器和超线程,这并不是最明智的做法。我的程序总是类似SIMD的,因此线程之间没有任何共享,对于HT计算机,我希望以我能想象的最聪明的方式将线程绑定到逻辑核:第一个逻辑核在第一个物理上,第一个逻辑核在第二个物理上,第一个逻辑在第n个物理上,第二个逻辑在第1个物理上,依此类推_C++_Multicore_Affinity_Hyperthreading - Fatal编程技术网

如何在C+中基于拓扑考虑在多核HT上实现亲和性+;节目? 我正在开发一些具有多个线程的C++多核程序,我想知道如何设置一个适当的(实际上是最好的)亲和力。我使用Boost线程,所以我可以调用get_hardware_concurrency()来了解有多少逻辑核。到目前为止,我编写了一个映射“第n个线程到第n个逻辑核”,但由于多套接字处理器和超线程,这并不是最明智的做法。我的程序总是类似SIMD的,因此线程之间没有任何共享,对于HT计算机,我希望以我能想象的最聪明的方式将线程绑定到逻辑核:第一个逻辑核在第一个物理上,第一个逻辑核在第二个物理上,第一个逻辑在第n个物理上,第二个逻辑在第1个物理上,依此类推

如何在C+中基于拓扑考虑在多核HT上实现亲和性+;节目? 我正在开发一些具有多个线程的C++多核程序,我想知道如何设置一个适当的(实际上是最好的)亲和力。我使用Boost线程,所以我可以调用get_hardware_concurrency()来了解有多少逻辑核。到目前为止,我编写了一个映射“第n个线程到第n个逻辑核”,但由于多套接字处理器和超线程,这并不是最明智的做法。我的程序总是类似SIMD的,因此线程之间没有任何共享,对于HT计算机,我希望以我能想象的最聪明的方式将线程绑定到逻辑核:第一个逻辑核在第一个物理上,第一个逻辑核在第二个物理上,第一个逻辑在第n个物理上,第二个逻辑在第1个物理上,依此类推,c++,multicore,affinity,hyperthreading,C++,Multicore,Affinity,Hyperthreading,我发现了很多讨论如何发现HT是否启用(CPUID)以及如何确定每个包的逻辑和物理核心的内容。我知道我必须处理一些汇编代码,这并不吓唬我,但我真的找不到如何了解有关逻辑核、物理核和包的完整信息,以及操作系统如何处理所有这些 尽我所能做到最简洁:我如何知道操作系统(Windows和Linux)称为第N个线程的确切位置(物理内核和包)?对于Windows:以及 还有GetCurrentProcessorNumber(),但是当您不将线程固定到特定的CPU上时,操作系统会频繁地交换线程,因此这本身对您的

我发现了很多讨论如何发现HT是否启用(CPUID)以及如何确定每个包的逻辑和物理核心的内容。我知道我必须处理一些汇编代码,这并不吓唬我,但我真的找不到如何了解有关逻辑核、物理核和包的完整信息,以及操作系统如何处理所有这些

尽我所能做到最简洁:我如何知道操作系统(Windows和Linux)称为第N个线程的确切位置(物理内核和包)?

对于Windows:以及

还有
GetCurrentProcessorNumber()
,但是当您不将线程固定到特定的CPU上时,操作系统会频繁地交换线程,因此这本身对您的目的没有帮助。

对于Windows:和


还有
GetCurrentProcessorNumber()
,但是当您不将线程固定到特定的CPU上时,操作系统会频繁地交换线程,因此这本身对您的目的没有帮助。

在linux上,查看一下linux上的,看看这里有一个代码片段,可以为您提供linux上的CPU拓扑结构

#!/bin/bash
function filter {
  cat /proc/cpuinfo | grep -E "$1.*: [0-9]*" | sed -e 's/^.*: //g'
}

CPU_ID=`filter processor`
SOCKET_ID=(`filter 'physical id'`)
CORE_ID=(`filter 'core id'`)

for cpu_id in $CPU_ID; do
    echo "cpu $cpu_id: socket${SOCKET_ID[$cpu_id]}_core${CORE_ID[$cpu_id]}"
done
如果在启用了HT的core i7上运行此操作,则会得到以下输出:

cpu 0: socket0_core0
cpu 1: socket0_core1
cpu 2: socket0_core2
cpu 3: socket0_core3
cpu 4: socket0_core0
cpu 5: socket0_core1
cpu 6: socket0_core2
cpu 7: socket0_core3
在这里,您可以看到cpu 0和4位于同一个内核上,即内核0上的HT线程


结合使用sched_setaffinity或将允许您将进程映射到一组CPU。也可以使用不带代码行的

下面是一段代码片段,它将为您提供Linux上的CPU拓扑结构

#!/bin/bash
function filter {
  cat /proc/cpuinfo | grep -E "$1.*: [0-9]*" | sed -e 's/^.*: //g'
}

CPU_ID=`filter processor`
SOCKET_ID=(`filter 'physical id'`)
CORE_ID=(`filter 'core id'`)

for cpu_id in $CPU_ID; do
    echo "cpu $cpu_id: socket${SOCKET_ID[$cpu_id]}_core${CORE_ID[$cpu_id]}"
done
如果在启用了HT的core i7上运行此操作,则会得到以下输出:

cpu 0: socket0_core0
cpu 1: socket0_core1
cpu 2: socket0_core2
cpu 3: socket0_core3
cpu 4: socket0_core0
cpu 5: socket0_core1
cpu 6: socket0_core2
cpu 7: socket0_core3
在这里,您可以看到cpu 0和4位于同一个内核上,即内核0上的HT线程


结合使用sched_setaffinity或将允许您将进程映射到一组CPU。也可以使用不带代码行的

多核环境中的拓扑和关联问题可以通过LIKWID工具套件方便地处理。除其他外,它包含用于计算拓扑、将线程固定到核心以及测量硬件性能指标的工具:


只要代码中的线程机制基于pthreads并且应用程序是动态链接的,likwid pin就可以将线程绑定到资源,而无需更改源代码。

多核环境中的拓扑和关联问题可以通过likwid工具套件方便地处理。除其他外,它包含用于计算拓扑、将线程固定到核心以及测量硬件性能指标的工具:


只要代码中的线程机制基于pthreads,并且应用程序是动态链接的,likwid pin可以将线程绑定到资源,而无需更改源代码。

+一个位于
GetLogicalProcessorInformation
之上的现成工具:用于显示配置。+一个位于
GetLogicalProcessorInformation
之上的现成工具:用于显示配置。谢谢,这将非常有用。但是,在C++程序中使用这个代码,我想我应该从系统()指令调用它。我可以避免吗?顺便说一句,它比使用asm、cpuid和所有这些汇编工具要好得多!我不会用系统来形容它。我的建议是,在shell脚本中创建一个包装器,首先找到cpu拓扑,然后将其作为参数传递给您的程序。谢谢,这将非常有用。但是,在C++程序中使用这个代码,我想我应该从系统()指令调用它。我可以避免吗?顺便说一句,它比使用asm、cpuid和所有这些汇编工具要好得多!我不会用系统来形容它。我的建议是,在shell脚本中创建一个包装器,首先找到cpu拓扑,然后将其作为参数传递给程序。