问题标签 [register-allocation]

For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.

0 投票
1 回答
604 浏览

memory - 块和分配管理中的 cuda 最大数量

我正在编写一个 CUDA 内核,我必须在这个设备上执行:

内核的最小形式是:

其中 Ndim=2, Nbins=128, devParameters 是一个类,其方法 p.lId 用于计算本地线程的 id(在块内),而 din2Cec 是一个类,用于使用新命令(在它的析构函数中,我实现了对应的 delete[])。nvcc 输出为:

线程数与多处理器限制兼容:最大共享内存、每个线程的最大寄存器和 MP 和每个 MP 的扭曲。如果我启动 64 个线程 X 30 个块(每块共享内存为 4128),没关系,但如果使用超过 30 个块,我会收到错误:

我认为这是分配单线程内存的问题,但我不明白每个 MP 和总块的限制是什么......有人可以帮助我或提醒正确的话题吗?

PS:我知道提供的内核什么都不做,但这只是为了了解我的极限问题。

0 投票
2 回答
1486 浏览

cuda - Cuda 单线程范围变量

是否可以让 cuda 使用在函数外部声明的单线程范围变量(寄存器或本地内存)?

我的大多数设备功能都需要使用相同的变量。

我不想将相同的变量作为参数传递给我的所有设备函数,而是在函数之外声明变量。

那可能吗?

我的计算能力是1.2。

编辑:一个例子:

3 个设备函数需要操作相同的变量。每个变量都是针对每个线程独立计算的。据我了解,我不能使用上面的代码,因为我不能声明变量以便它们对每个线程都是本地的。

我必须做的是在内核函数中声明所有变量,然后将指向变量的指针传递给所有其他函数:

0 投票
2 回答
277 浏览

fortran - Fortran 中的“等价”

我知道两个变量,比如 a1 和 a2 出现在 Fortran 的 Equivalence(a1,a2) 语句中,然后它们占用相同的内存空间。所以说这发生在 a1 和 a2 都是该过程中的局部变量的过程中。

这意味着您不能只在内存中拥有 a1 和 a2 的副本,对吗?因为其中一个值将被覆盖。您可以将 a1 保存在内存位置,并将 a2 保存在整个过程的寄存器中,这样可以吗?

我的问题基本上是:您可以将 a1 保存在整个程序的寄存器中吗?

我会说是的...除非您用完寄存器并且必须将 a1 存储回内存。然后您将覆盖 a2 并丢失它的值,然后变量 a1 和 a2 将实际指向 a1 的值。

0 投票
2 回答
1200 浏览

llvm - 添加一个新的寄存器分配通道 llvm

我正在 llvm 上编写一个新的寄存器分配通道。我按照这里的说明http://llvm.org/docs/WritingAnLLVMPass.html#the-machinefunctionpass-class

该通行证不显示在 llc --help 中。我将贪婪分配算法更改为以名称“greedier”注册并构建。即使这似乎并没有反映在有限责任公司中。任何人都可以帮忙吗?

0 投票
1 回答
118 浏览

memory - 关于内存模型的问题

当我阅读与编译器相关的书时,我看到有两种主要的内存模型。

注册到注册模型和内存到内存模型。

在书中,它说寄存器到寄存器模型忽略了机器对寄存器数量的限制,并且编译器后端必须插入加载和存储。是因为寄存器到寄存器模型可以使用虚拟寄存器......并且这个模型保留了所有可以存储在寄存器中的值,所以在完成之前它必须插入加载和存储(与内存相关)?

此外,在内存到内存的部分,这本书说编译器后端可以删除冗余的加载和存储。这是否意味着模型必须删除多余的内存使用以进行优化?

0 投票
1 回答
67 浏览

compiler-construction - 什么程序会有BRIGGS94中提到的钻石干涉图?

我正在阅读 Briggs94 Improvements to Graph Coloring Register Allocation。

我只是想知道什么样的程序会有菱形干涉图?即对于四个生命范围 w、x、y、z:w 干扰 x,x 干扰 z,z 干扰 y,y 干扰 w。并且没有更多的其他干扰。

由于 w 和 z 都会干扰 x 和 y,因此在时间轴上,在有效范围 x 和 y 之间必须有一个洞。并且 w 和 z 都会穿过这个洞,导致 w 干扰 z,矛盾。

(这里是论文的链接:http ://citeseerx.ist.psu.edu/viewdoc/download?doi=10.1.1.23.253&rep=rep1&type=pdf )

0 投票
2 回答
586 浏览

c++ - When does data move around between SSE registers and the stack?

I'm not exactly sure what happens when I call _mm_load_ps? I mean I know I load an array of 4 floats into a __m128, which I can use to do SIMD accelerated arithmetic and then store them back, but isn't this __m128 data type still on the stack? I mean obviously there aren't enough registers for arbitrary amounts of vectors to be loaded in. So these 128 bits of data are moved back and forth each time you use some SIMD instruction to make computations? If so, than what is the point of _mm_load_ps?

Maybe I have it all wrong?

0 投票
1 回答
1294 浏览

c - x86 寄存器重命名的成本

以下代码在 amd64 上使用 gcc 或 clang 编译

产生以下程序集:

由于按位and应该是关联的,人们会假设将成对累积到两个寄存器然后and这两个寄存器会更有效。这将打破依赖性并允许在具有多个 ALU 的 CPU 上并行执行。

正如编译器and对所有操作都使用同一个寄存器一样,我假设它依赖于 cpu 能够进行寄存器重命名以破坏依赖关系本身。

CPU 的寄存器重命名功能是否免费并且在 amd64 上始终可用,或者编译器为什么要这样编译代码?

更新:

我发现如果将树关联宽度的更高值传递给 gcc,则 gcc 可以执行预期的依赖链中断:

0 投票
1 回答
980 浏览

c++ - 寄存器分配算法

我正在尝试为 Trees 实现代码生成/寄存器分配算法,以支持我的旧算法,我将所有内容都放在堆栈上。现在我正在尝试实现Sethi-Ullman 算法,但仅从我在 Wikipedia 和一些网页上找到的内容来看,该算法的某些部分对我来说仍然不清楚。

我正在寻找一些伪代码/C/C++ 工作代码中缺少的部分的解释。

1)我应该使用哪种方法来选择免费注册?即,正在使用的寄存器堆栈。我正在使用我认为非常差的一个:交替返回寄存器:如果以前使用的寄存器是 R0,则返回 R1。如果是 R1,则返回 R0,依此类推。它不适用于小表情。

2)什么时候我应该做什么label(left) >= K and label(right) >= K

这是labelsethi-ullman功能

对于像这样的 exp 中的树:

它确实生成:

从这样的一个:

它确实生成:

上面我只提供了主要算法,但如果需要,我可以为您机器上的测试用例提供完整代码。

0 投票
1 回答
82 浏览

compiler-construction - 如何处理多个溢出值作为单个指令的操作数?

我想实现Poletto 和 Sarkar 提出的线性扫描寄存器分配算法。它非常简单,并为每个活动间隔分配一个寄存器或堆栈位置。

只有当已分配寄存器的活动间隔的数量等于寄存器的数量(即没有更多空闲寄存器)时,才会将堆栈位置分配给一个间隔。

算法:

线性扫描寄存器分配器

假设一个 x86 指令add a, b,其中ab是变量,这两个变量都被该算法分配了一个堆栈位置(溢出)。无法使用两个内存操作数对这条指令进行编码,因此至少有一个操作数必须驻留在寄存器中。我会mov REG, a在指令之前插入一个,但据我了解该算法,此时代码中没有空闲寄存器。这通常是如何解决的?