ICode9

精准搜索请尝试: 精确搜索
首页 > 其他分享> 文章详细

硬件多线程

2020-12-12 12:32:58  阅读:160  来源: 互联网

标签:1024 execute 硬件 指令 线程 inst 多线程 时钟


世界上最简单的处理器核心是什么样的?单核单线程!

现以GPU为例。

渲染1024个顶点,也就是1024个线程。渲染的Shader程序由两条指令组成,且都是算术逻辑指令。所有算术逻辑指令的执行都花费一个时钟周期。

FragThread threads[1024];
for (auto thread : threads) {
    for (auto inst : thread.insts()) {
        inst.execute(1, ALU); // inst execute on an ALU for 1 cycle
    }
}

那么,渲染完1024个顶点需要花费2048个时钟周期,也就是1024个线程 x 2条指令/线程 x 1个时钟/指令。

如果把Shader程序改复杂一点,将其中一条指令改为加载纹理数据指令。

一般来说,访问显存所花费的时钟数几百到上千不等。不妨假设执行一条加载纹理数据指令花费999个时钟。

FragThread threads[1024];
for (auto thread : threads) {
    for (auto inst : thread.insts()) {
        if (inst is arithmetic operation)
            inst.execute(1, ALU); // inst execute on an ALU for 1 cycle
        if (inst is texture operation)
            inst.execute(999, TU); // inst execute on an TU for 999 cycles
    }
}

此时,渲染完1024个顶点需要花费102400个时钟周期,也就是1024个线程 x 1000个时钟/线程。可以看到,时钟数是之前的500倍!

不难想到,如果像加载纹理数据这一类型的指令比较多的情况下,我们的处理器执行效率将非常低。

优化!

线程0执行到加载指令后,不傻傻等待立马切换线程,让线程1继续从头开始执行直到也执行到加载指令,接着再切换到线程2执行,直到最后一个线程1023。接下来,又回到线程0的执行,这时候线程0请求的纹理数据已经加载回来了,因为已经过去了1024个时钟,而加载只需要999个时钟,线程0立马结束。后面的线程以此类推。

此时,渲染完1024个顶点需要花费3072个时钟周期,也就是1024个线程 x 3个时钟/线程。可以看到,时钟数直线下降。

这就达到了隐藏延迟的效果。

但需要达到上面的效果的前提是,线程切换速度足够快。做法便是给每个线程增加一点独立的存储,这样切换便类似于修改指针的指向,代价很小。

标签:1024,execute,硬件,指令,线程,inst,多线程,时钟
来源: https://www.cnblogs.com/cngpus/p/14124262.html

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有