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的参数(不记得细节了。)
- 5星
- 4星
- 3星
- 2星
- 1星
- 暂无评论信息
