请问:cpu/gpu是否支持 内存读取与运算过程 并行?

GKatHere 2024-11-24 15:05:33
//    如下,请问,fa更快还是fb更快
void fa(float* a_, float* b_)
{
	float a = *a_;		//
	float b = *b_;		//	放这
	for (size_t i = 0; i < 1000000; i++)
		a *= a;
	*a_ = a;

	for (size_t i = 0; i < 1000000; i++)
		b *= b;
	*b_ = b;

}
void fb(float* a_, float* b_)
{
	float a = *a_;		//
	for (size_t i = 0; i < 1000000; i++)
		a *= a;
	*a_ = a;

	float b = *b_;		//	放这
	for (size_t i = 0; i < 1000000; i++)
		b *= b;
	*b_ = b;

}

 

...全文
104 6 打赏 收藏 转发到动态 举报
写回复
用AI写文章
6 条回复
切换为时间正序
请发表友善的回复…
发表回复
ztenv 版主 11-25
  • 打赏
  • 举报
回复 1

CISC和RISC目前都支持,具体和还要和数据是否读到CACHE有关系(受多种因素的影响),有的时候CPU会等待数据就绪的(读到CACHE),如果由于某种原因数据没有及时读到CACHE,那么这种并行就不是真的并行了。

赵4老师 11-25
  • 打赏
  • 举报
回复 1

CUDA

forever74 11-25
  • 打赏
  • 举报
回复 1

编译器不同,优化也不同,编译开关不同,编译结果不同;
CPU的型号不同,具体操作的时序可能不同;
内存的参数不同,具体的操作时序一定不同。


我面前米饭里的这粒米,当初在水稻穗子的顶部还是底部呢?
我要是有钱了,是不是只吃每个稻穗最顶上的那粒米呢?
我真的很有钱,可是他们说我面前每一粒米都来自一个稻穗的最顶上这句话是不是在骗我呢?

  • 打赏
  • 举报
回复 1

为什么不

for (size_t i = 0; i < 1000000; i++)
    a *= a, b *= b;
GKatHere 11-24
  • 举报
回复
@日立奔腾浪潮微软松下联想 我只是在考虑,cpu是检测是真实读出内存数据,然后再进行下一步;还是发出读内存命令,然后不管了,执行下一步(一至到使用此数据再去检测是否已经读出数据)。(即内存操作来命令并发)
@GKatHere 取决于微架构设计,通常译码部件在取到一条指令的时候,就可以分析出它要用到什么数据(也可能没有没有用到),所以在把指令发射到执行单元的同时,就可以驱动load单元去取数据,这样就能实现(部分)并行。但是早期的CPU设计是串行的, 像386,指令的每一步都要上一步完成之后才能开始,而且一条指令也要等到上一条指令执行完成之后才能开始(非流水线设计)。

65,108

社区成员

发帖
与我相关
我的任务
社区描述
C++ 语言相关问题讨论,技术干货分享,前沿动态等
c++ 技术论坛(原bbs)
社区管理员
  • C++ 语言社区
  • encoderlee
  • paschen
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
  1. 请不要发布与C++技术无关的贴子
  2. 请不要发布与技术无关的招聘、广告的帖子
  3. 请尽可能的描述清楚你的问题,如果涉及到代码请尽可能的格式化一下

试试用AI创作助手写篇文章吧