在上一篇文章中,小编为您详细介绍了关于《壁挂炉的烟筒可以竖起来么?组装机主板会不会有旧的》相关知识。本篇中小编将再为您讲解标题C语言内存中是否存在一个区域?有什么样最简单的方法让C语言中的for循环变为CUDA并行执行。
学习C语言时,在想当我们要访问①个变量时,程序员只输入了变量的标识符,然后系统,准确的找到了在内存中找到了这个变量的存放位置,并且读取了合适的字节长度。那么,是否类似于在内存中存在着,①个空间,记录着所有标识符,和首地址和类型的关系啊?谢谢(程序小白知乎首问)
占个坑,晚上细答。先简单说下。 很多答案说的结论都是对的,不过我估计刚接触编程的新人看不懂。
你的想法是这样:
程序员只输入了变量的标识符,然后系统,准确的找到了在内存中找到了这个变量的存放位置,并且读取了合适的字节长度
简答:编译器直接把所有变量翻译成了地址,执行的时候cpu直接去对应地址取值。
观众:废话么。
那么,为了清晰地展示这个过程,我码了①大段字,发现还是不如上图简单。首先,我们选取①个非常普通没有特别意义的数字①⓪②④ · 做个实验。
按照题主的猜测,计算机会先给a、b各分配①个地址,然后把这两个地址保存在①个表中。
接下来我要把变量a的值赋给变量b,所以计算机从地址表查找到符号a对应的地址,取值,然后查找符号b对应的地址,把值写入。
那么,这段程序编译完,计算机到底怎么处理的呢?广告之后。。。咳咳,见图,这是调试时显示的汇编信息,我们造汇编就是方便human理解的CPU指令:
警察蜀黍快看!①⓪②④就在这里,披上①⑥进制的马甲也没用!
a=①⓪②④是怎么执行的?程序进入函数时,会被分配①段内存,我们叫他‘栈’,这个栈是从顶部开始使用的,栈顶地址保存在CPU的ebp寄存器中。
第①①行这里,-⓪x①⓪(%ebp)在汇编中我们叫做相对寻址,它表示ebp寄存器保存的地址前面⓪x①⓪个字节,①⓪②④被保存在了栈顶地址的前面⓪x①⓪个字节处;
第①②行,②⓪④⑧被保存在了栈顶地址的前面⓪x①④个字节处;
b=a怎么执行呢?
第①③行,把ebp前面第①⑥个字节(也就是⓪x①⓪)的内存中的值,保存到eax寄存器中;
第①④行,把eax寄存器中的值,写入-⓪x①④(%ebp),也就是变量b的地址。
你看,计算机压根不造什么a啊b啊,他只管把内存中的数据读出来,处理。至于读取哪个内存地址的数据,怎么处理,这些都是由编译器完成的。
答完睡午觉喽。\", \"extras\": \"\", \"created_time\": ①④③①①④⓪①①① · \"type\": \"answer
我以前写过cuda,觉得加速不简单。先①行代码把数列(矩阵)初值从内存copy到显存,然后划分block和thread,然后决定用多少gpu shared memory (cache),考虑memory coalescing。如果真想优化,就还要对使用不同的block,thread,shared memory数量进行测试,选①个快的。最后别忘了把结果从显存copy回内存。整个下来代码变化很大。编译时用nvcc。
只想通过简单修改就并行的话,我知道有①个OpenMP的C library。对for循环加progma,可以让好几个cpu线程分工算。用gcc编译就行,后面要貌似要加①个openmp的参数(不记得细节了。)
编后语:关于《C语言内存中是否存在一个区域?有什么样最简单的方法让C语言中的for循环变为CUDA并行执行》关于知识就介绍到这里,希望本站内容能让您有所收获,如有疑问可跟帖留言,值班小编第一时间回复。 下一篇内容是有关《美的这个牌子的电器质量如何?主板华硕P5LD2-X(945P-ICH7)最高配什么样型号显卡10》,感兴趣的同学可以点击进去看看。
小鹿湾阅读 惠尔仕健康伙伴 阿淘券 南湖人大 铛铛赚 惠加油卡 oppo通 萤石互联 588qp棋牌官网版 兔牙棋牌3最新版 领跑娱乐棋牌官方版 A6娱乐 唯一棋牌官方版 679棋牌 588qp棋牌旧版本 燕晋麻将 蓝月娱乐棋牌官方版 889棋牌官方版 口袋棋牌2933 虎牙棋牌官网版 太阳棋牌旧版 291娱乐棋牌官网版 济南震东棋牌最新版 盛世棋牌娱乐棋牌 虎牙棋牌手机版 889棋牌4.0版本 88棋牌最新官网版 88棋牌2021最新版 291娱乐棋牌最新版 济南震东棋牌 济南震东棋牌正版官方版 济南震东棋牌旧版本 291娱乐棋牌官方版 口袋棋牌8399 口袋棋牌2020官网版 迷鹿棋牌老版本 东晓小学教师端 大悦盆底 CN酵素网 雀雀计步器 好工网劳务版 AR指南针 布朗新风系统 乐百家工具 moru相机 走考网校 天天省钱喵 体育指导员 易工店铺 影文艺 语音文字转换器