当前位置:首页 > 每日看点 > 正文内容

为什么 m1 采用大小核设计却没有 intel 的问题?

卡卷网1年前 (2025-01-18)每日看点218

简要回答的就是,苹果的全家桶,只要你不强制要求大核心多线程全程占满的调度方式 ..... 你执行普通代码,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芯片控制调度合理性方面要容易得多 .....

扫描二维码推送至手机访问。

版权声明:本文由卡卷网发布,如需转载请注明出处。

本文链接:https://www.kajuan.net/ttnews/2025/01/9897.html

分享给朋友:

相关文章

为什么微服务一定要有网关?

为什么微服务一定要有网关?

网关一句话总结,网关的作用是上浮公共逻辑,下沉差异逻辑。公共逻辑就是所有接口都需要做的事,比如权限校验,限流算法等,这样业务就只需要关心业务逻辑即可。下面是一个对比图: 当然除了一些公共逻辑外,路由也是网关的核心功能,它可以进行流量转发。...

想要在双 11 换一台全面无短板的新手机,有没有「闭眼买」的机型推荐?

想要在双 11 换一台全面无短板的新手机,有没有「闭眼买」的机型推荐?

最近一个月各大手机厂商的旗舰机扎堆发布,不知道大家看爽了没?这一代的性能续航大提升,最低 3599 元就能买到,同时老款也有不小的降幅,今年双 11 算是相当适合换手机的节点了!这次,小黑就给大家推荐双 11 期间值得购买的手机...150...

都是前端框架,为什么用 React 的人会有优越感?

都是前端框架,为什么用 React 的人会有优越感?

上家公司一直搞react,最近第一次写个vue3项目。老板朋友来了看了下页面说:这用vue写的吧。我:是...老板朋友:一看就知道是vue做的。这tm你看一眼页面就知道用的啥框架?这感觉就是,我一直用苹果,偶尔用了下华为打电话,有个人离老远...

有哪些让你目瞪口呆的 Bug ?

有哪些让你目瞪口呆的 Bug ?

成都有个监狱情况比较特殊,关押的基本全是重犯,而且还都是经济犯和政治犯,他们以前都是一方大佬,在自己的一亩三分地翻手为云覆手为雨,无非是不小心中箭落马或帮老大顶锅才进监狱,所以即使进来了,他们依然保持着体面和骄傲,依从性差,虽然不至于和监狱...

你怎么看待软件测试这个工作的?

你怎么看待软件测试这个工作的?

先说一个插曲:上个月我有同学在深圳被裁员了,和我一样都是软件测试,不过他是平安外包,所以整个组都撤了,他工资和我差不多都是14K。现在IT互联网已经比较寒冬,特别是软件测试,裁员先裁测试,这几乎都是定律。我最近看了某音很多应届生以及去年毕业...

作为一名网络工程师,每天日常工作是什么样的?

作为一名网络工程师,每天日常工作是什么样的?

先介绍下我的基本情况,本人女,不知名的网络工程师一枚,入行也有三四年了。虽然我只在代理商和集成商干过,但怎么也算是“业内人士”一枚,没吃过猪肉总见过猪跑嘛。今天,就以我经历过,或者了解过的网络工程师,来给大家介绍一下到底每天的工作日常是什么...

发表评论

访客

看不清,换一张

◎欢迎参与讨论,请在这里发表您的看法和观点。