我正在尝试使用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.我打算在此应用程序中进一步实现多线程,因此将违规的矢量实例声明为静态不是一种选择.如果需要,我愿意增加矢量数据结构的大小.
我有一个问题,我有八个可以包含 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.
我有一组我需要支持的操作:
0t12211012并且我希望将 a2放在保持零的位置,我可以简单地添加0t200=18. (请注意,转换为 tritspace 很容易,因为我只有 8 个 trit,所以我可以将基本幂存储在寄存器中并使用 pshufw 对其进行索引)。0t12211012,我希望能够提取位掩码 for 0,即0b00000100, for 1,即0b10011010,和 for 2,即0b01100001。这我还没有想出该怎么做,这就是我想要的帮助。如何在适用于 x86 SIMD 的少量操作中做到这一点?谢谢!
20 年 18 月 11 日编辑:举一个我认为太慢的方法的例子:我们可以迭代地找到值 mod 3 并除以 3 以从表示的最不重要的一端拉出trits,然后以这种方式组装掩码. …
我有一个可能相当独特的问题.我有一个应用程序,当我不在场时长时间在无头盒子上运行,但并不重要.我希望能够使用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