小编har*_*old的帖子

最小的加法链取幂

我知道它已被证明是NP完全的,那没关系.我正在用分支和边界解决它,我将初始上限设置为正常二进制平方/乘法算法的乘法次数,并且它确实给出了正确的答案,但我对运行不满意时间(200左右的数字可能需要几秒钟).这是一个NP完全问题,我不期待任何壮观的事情; 但通常有一些技巧可以让实际时间得到控制.

在实践中有更快的方法吗?如果是这样,他们是什么?

algorithm np-complete exponentiation

7
推荐指数
1
解决办法
1946
查看次数

使用CL寄存器的移位会导致部分寄存器停顿吗?

变量移位是否会产生部分寄存器停顿(或寄存器重组μops)ecx?如果是这样,哪些微体系结构?

我在Core2(65nm)上进行了测试,这似乎是只读的cl.

_shiftbench:
    push rbx
    mov edx, -10000000
    mov ecx, 5
  _shiftloop:
    mov bl, 5   ; replace by cl to see possible recombining
    shl eax, cl
    add edx, 1
    jnz _shiftloop
    pop rbx
    ret
Run Code Online (Sandbox Code Playgroud)

更换mov bl, 5mov cl, 5没有什么区别,这是否有寄存器重组正在进行,如可以通过更换证明它会shl eax, cl通过add eax, ecx(该版本在我的测试add写入时,经历了2.8倍放缓cl,而不是bl).


检测结果:

  • Merom:没有观察到失速
  • Penryn:没有观察到失速
  • Nehalem:没有观察到失速

更新:shrxHaswell 的新班组确实表明失速.shift-count参数不是写成8位寄存器,因此可能是预期的,但文本表示实际上并没有说明这种微架构细节.

performance x86 assembly

7
推荐指数
1
解决办法
1035
查看次数

计算零抑制二元决策图中连接的算法

计算两个零抑制二元决策图的连接的算法是什么?

我现在已经搜索了几个小时,我找不到它.据我所知,它并不在Knuth的书中,尽管它确实给出了结果的定义.

我宁愿不必涉及任何具体的实施; 我发现实施细节非常分散注意力.


ZDDs的加入fg{ a ? b | a ? f and b ? g }

algorithm binary-decision-diagram

5
推荐指数
1
解决办法
437
查看次数

x86汇编中的高效复杂算法

考虑以下程序:

for i=1 to 10000000 do
  z <- z*z + c
Run Code Online (Sandbox Code Playgroud)

在哪里zc是复杂的数字.

使用x87 vs SSE和单对双精度算法,该程序的高效x86汇编程序实现是什么?

编辑我知道我可以用另一种语言编写这个并信任编译器为我生成最佳的机器代码,但我这样做是为了学习如何自己编写最佳的x86汇编程序.我已经查看了生成的代码gcc -O2,我的猜测是有很大的改进空间,但我不够熟练自己编写最佳的x86汇编程序,所以我在这里寻求帮助.

x86 assembly

5
推荐指数
2
解决办法
1680
查看次数

我可以摆脱 CTZ 和添加到指针之间的符号扩展吗?

对于这样的代码:

#include <stdint.h>

char* ptrAdd(char* ptr, uint32_t x)
{
    return ptr + (uint32_t)__builtin_ctz(x);
}
Run Code Online (Sandbox Code Playgroud)

GCC 生成一个符号扩展:(godbolt 链接

xor eax, eax
rep bsf eax, esi
cdqe ; sign-extend eax into rax
add rax, rdi
ret
Run Code Online (Sandbox Code Playgroud)

当然,这完全是多余的——这是公然对无符号整数进行符号扩展。我可以说服海湾合作委员会不要这样做吗?

这个问题自 GCC 4.9.0 以来就存在,但在此之前它曾经是一个显式的零扩展,这也是多余的。

x86 assembly gcc

5
推荐指数
1
解决办法
148
查看次数

为什么我的代码会抛出无效的强制转换异常?(C#)?

错误信息:System.InvalidCastException:无法将类型为"ClassLibrary1.Plugin"的对象强制转换为"PluginInterface.IPlugin".

我正在尝试做的是让我的程序访问一个程序集并运行它可能具有的任何东西.这会加载.dll

private void AddPlugin(string FileName)
{
Assembly pluginAssembly = Assembly.LoadFrom(FileName);
foreach (Type pluginType in pluginAssembly.GetTypes())
{
if (pluginType.IsPublic)
{
if (!pluginType.IsAbstract)
{
Type typeInterface = pluginType.GetInterface("PluginInterface… true);
if (typeInterface != null)
{
Types.AvailablePlugin newPlugin = new Types.AvailablePlugin();
newPlugin.AssemblyPath = FileName;
newPlugin.Instance = (IPlugin)Activator.CreateInstance(plugin…
// Above line throws exception.

newPlugin.Instance.Initialize();
this.colAvailablePlugins.Add(newPlugin);
newPlugin = null;
}
typeInterface = null;
}
}
}
pluginAssembly = null;
}
Run Code Online (Sandbox Code Playgroud)

我的程序和程序集都有这两个接口:

using System;

namespace PluginInterface
{
public interface IPlugin
{
IPluginHost Host { get; set; …
Run Code Online (Sandbox Code Playgroud)

.net c# dll .net-assembly

2
推荐指数
1
解决办法
977
查看次数

我为什么要放弃添加二进制数?

在此输入图像描述

例如,对于8位数.我为什么要放弃这个?我明白溢出只是当我在同一个符号中添加2个数字并在另一个符号中得到结果时.这是什么情况?

binary assembly computer-science computer-architecture

0
推荐指数
1
解决办法
2149
查看次数

C++ XOR运算符优先级

所以我在这里很困惑,确实:是

 a ^= b^c 
Run Code Online (Sandbox Code Playgroud)

相当于

 a = a ^ (b ^ c) 
Run Code Online (Sandbox Code Playgroud)

或者是a = (a ^ b) ^ c吗?

c c++

-8
推荐指数
1
解决办法
302
查看次数