为什么 m1 采用大小核设计却没有 intel 的问题?
作者:卡卷网发布时间:2025-01-18 19:04浏览数量:94次评论数量:0次
简要回答的就是,苹果的全家桶,只要你不强制要求大核心多线程全程占满的调度方式 ..... 你执行普通代码,Apple 不需要你考虑调度问题,然后它那个默认调度吧 .... 就是优先大核心短时高频单线程调度。
其实你要是跑过mac的峰值曲线就不会说出来什么,mac绝大部分情况下都只跑小核心的错误观点了,mac也好Apple家其他产品也好,始终要有一颗大核是绑死在UI线程也就是主线程上面的。
其实比较靠谱的能够确保一定会让自己的程序执行在mac的全部大核心的方式只有一个,"如果需要更精确地控制任务在特定核心上运行,可以使用底层 API(如pthread
)来设置线程亲和性(Thread Affinity)。这种方法需要更深入的系统编程知识。"
下文是AI生层代码块
import Foundation
// 创建一个线程
var thread: pthread_t?
pthread_create(&thread, nil, { _ in
// 设置线程亲和性(绑定到大核)
var cpuset = pthread_affinity_np_t()
pthread_affinity_np_init(&cpuset)
// 假设大核是 CPU 0 和 1(具体核心编号需要根据硬件确定)
pthread_affinity_np_set(&cpuset, 0) // 绑定到 CPU 0
pthread_affinity_np_set(&cpuset, 1) // 绑定到 CPU 1
// 应用线程亲和性
pthread_setaffinity_np(pthread_self(), MemoryLayout.size(ofValue: cpuset), &cpuset)
// 任务逻辑
print("Task running on high-performance core")
for i in 0..<10 {
print("Task \(i)")
}
return nil
}, nil)
// 等待线程完成
pthread_join(thread!, nil)
这样,我们简单看一下,在window平台上使用代码约束程序跑在全部大核心的做法是什么:
package main
import (
"fmt"
"log"
"runtime"
"golang.org/x/sys/windows"
)
// 绑定当前线程到指定 CPU 核心
func bindThreadToCPU(cpuID int) error {
// 获取当前线程句柄
threadHandle := windows.CurrentThread()
// 创建 CPU 集合
var cpuSet uint64
cpuSet |= 1 << uint(cpuID) // 将指定 CPU 核心加入集合
// 设置线程的 CPU 亲和性
if err := windows.SetThreadAffinityMask(threadHandle, cpuSet); err != nil {
return fmt.Errorf("failed to set thread affinity: %v", err)
}
return nil
}
// 绑定到全部大核心
func bindToBigCores(bigCores []int) error {
for _, core := range bigCores {
if err := bindThreadToCPU(core); err != nil {
return err
}
}
return nil
}
func main() {
// 假设大核心编号为 0-7(根据实际硬件配置调整)
bigCores := []int{0, 1, 2, 3, 4, 5, 6, 7}
// 绑定主线程到大核心
if err := bindToBigCores(bigCores); err != nil {
log.Fatalf("Failed to bind to big cores: %v", err)
}
// 启动多个 Goroutine,每个 Goroutine 绑定到一个大核心
for i := 0; i < runtime.GOMAXPROCS(0); i++ {
go func(id int) {
if err := bindThreadToCPU(bigCores[id%len(bigCores)]); err != nil {
log.Printf("Worker %d failed to bind: %v", id, err)
return
}
// 执行计算密集型任务
performWork()
}(i)
}
// 防止主线程退出
select {}
}
// 模拟计算密集型任务
func performWork() {
for i := 0; i < 100000000; i++ {
_ = i * i
}
}
下文是AI提供的自动执行代码。
有代码常识的大佬看到这段代码应该就明白过来了,Apple是通过所谓的 “亲和性” 控制的,就是,它不是强制的,更强的约束力来自于Apple自己的多线程逻辑,而 Win11,intel呢,很不幸,是程序员使用指令集硬性控制的,这就非常考验程序员在面对密集型任务的时候,对于程序外资源调度程度的把控了。什么叫做性能差和卡死,说穿了就是系统CPU资源分配的不合理,这一点显而易见,强制自己具备调控最高优先级的Apple芯片要比Win11下的intel芯片控制调度合理性方面要容易得多 .....
免责声明:本文由卡卷网编辑并发布,但不代表本站的观点和立场,只提供分享给大家。
相关推荐

你 发表评论:
欢迎