小编Oct*_*nus的帖子

堆栈上的G ++ SSE内存对齐

我正在尝试使用Streaming SIMD Extensions重新编写光线跟踪器.我的原始光线跟踪器使用内联汇编和movups指令将数据加载到xmm寄存器中.我已经读过编译器内在函数并不比内联汇编慢得多(我怀疑我甚至可以通过避免未对齐的内存访问来获得速度),而且更加可移植,所以我试图迁移我的SSE代码以使用xmmintrin.h中的内部函数.受影响的主要类是vector,它看起来像这样:

#include "xmmintrin.h"
union vector {
    __m128 simd;
    float raw[4];
    //some constructors
    //a bunch of functions and operators
} __attribute__ ((aligned (16)));
Run Code Online (Sandbox Code Playgroud)

我之前已经读过g ++编译器会自动地沿着内存边界分配结构,这些结构等于最大成员变量的大小,但是这似乎没有发生,并且对齐的属性没有帮助.我的研究表明,这可能是因为我在堆栈上分配了一大堆函数局部向量,并且在x86中无法保证堆栈上的对齐.有没有办法强制这种对齐?我应该提一下,这是在32位机器上的本机x86 Linux下运行,而不是Cygwin.我打算在此应用程序中进一步实现多线程,因此将违规的矢量实例声明为静态不是一种选择.如果需要,我愿意增加矢量数据结构的大小.

c++ assembly memory-management sse alignment

12
推荐指数
1
解决办法
4447
查看次数

测试在二进制表示中设置了哪些 trit

我有一个问题,我有八个可以包含 0、1 或 2 的元素。我可以很容易地用 16 位来表示它,但是出于 SIMD 效率的原因,我需要它占据 13 位(它不是唯一存在的东西)在车道)。

幸运的是,2^13==8192, 和3^8==6561,所以我想要的状态可以适合。然而,这就是事情变得有趣的地方。天真地,我只是通过计算三元数字状态来表示这些状态。例如,要表示 tritmask 0t12211012(尽管我将使用它作为示例),我可以只写0t12211012 = 2*3^0+1*3^1+0*3^2+1*3^3+1*3^4+2*3^5+2*3^6+1*3^7 = 4244 = 0b1000010010100.

我有一组我需要支持的操作:

  • 修改琐事。这在默认表示中很容易。例如,如果我有 tritmask0t12211012并且我希望将 a2放在保持零的位置,我可以简单地添加0t200=18. (请注意,转换为 tritspace 很容易,因为我只有 8 个 trit,所以我可以将基本幂存储在寄存器中并使用 pshufw 对其进行索引)。
  • 查找设置为特定值的所有元素。例如,给定 tritmask 0t12211012,我希望能够提取位掩码 for 0,即0b00000100, for 1,即0b10011010,和 for 2,即0b01100001。这我还没有想出该怎么做,这就是我想要的帮助。如何在适用于 x86 SIMD 的少量操作中做到这一点?

谢谢!

20 年 18 月 11 日编辑:举一个我认为太慢的方法的例子:我们可以迭代地找到值 mod 3 并除以 3 以从表示的最不重要的一端拉出trits,然后以这种方式组装掩码. …

c++ math sse bit-manipulation ternary

8
推荐指数
0
解决办法
119
查看次数

C#挂起所有线程

我有一个可能相当独特的问题.我有一个应用程序,当我不在场时长时间在无头盒子上运行,但并不重要.我希望能够使用Visual Studio远程调试此应用程序.为此,我的代码如下所示:

// Suspend all other threads to prevent loss
// of state while we investigate the issue.
SuspendAllButCurrentThread();
var remoteDebuggerProcess = new Process
    {
        StartInfo =
            {
                UseShellExecute = true,
                FileName = MsVsMonPath;
            }
    };
// Exception handling and early return removed here for brevity.
remoteDebuggerProcess.Start();

// Wait for a debugger attach.
while (!Debugger.IsAttached)
{
    Thread.Sleep(500);
}
Debugger.Break();

// Once we get here, we've hit continue in the debugger. Restore all of our threads,
// then get rid of …
Run Code Online (Sandbox Code Playgroud)

c# multithreading remote-debugging thread-safety visual-studio-debugging

6
推荐指数
1
解决办法
1085
查看次数