C语言内存中是否存在一个区域?有什么样最简单的方法让C语言中的for循环变为CUDA并行执行

时间:2017-12-20 08:12:01   浏览:次   点击:次   作者:   来源:   立即下载

学习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的参数(不记得细节了。)

收起

相关推荐

相关应用

平均评分 0人
  • 5星
  • 4星
  • 3星
  • 2星
  • 1星
用户评分:
发表评论

评论

  • 暂无评论信息