多线程直列组件
Multithreaded inline assembly
我正在尝试在T4机器上快速创建大量的SHA256哈希。T4具有" SHA256"指令,使我可以在一个OP代码中计算哈希。我创建了一个内联装配模板来调用SHA256 OPCODE:
在我的C 代码中:
extern "C"
{
void ProcessChunk(const char* buf, uint32_t* state);
}
pchunk.il:
.inline ProcessChunk,8
.volatile
/* copy state */
ldd [%o1],%f0 /* load 8 bytes */
ldd [%o1 + 8],%f2 /* load 8 bytes */
ldd [%o1 +16],%f4 /* load 8 bytes */
ldd [%o1 +24],%f6 /* load 8 bytes */
/* copy data */
ldd [%o0],%f8 /* load 8 bytes */
ldd [%o0+8],%f10 /* load 8 bytes */
ldd [%o0+16],%f12 /* load 8 bytes */
ldd [%o0+24],%f14 /* load 8 bytes */
ldd [%o0+32],%f16 /* load 8 bytes */
ldd [%o0+40],%f18 /* load 8 bytes */
ldd [%o0+48],%f20 /* load 8 bytes */
ldd [%o0+56],%f22 /* load 8 bytes */
sha256
nop
std %f0, [%o1]
std %f2, [%o1+8]
std %f4, [%o1+16]
std %f6, [%o1+24]
.end
在单个螺纹环境中,事情运作良好,但还不够快。我使用OpenMP并行化了该应用程序,以便可以同时调用ProcessChunk。应用程序的多线程版本可用于几个线程,但是当我增加线程数时(例如16),我开始获得虚假结果。流程查克函数的输入都是每个线程本地本地的堆栈变量。我已经确认,无论线程数量多少,输入都是正确生成的。如果我将ProcessChunk放入关键部分,我会得到正确的结果,但是性能会大大降低(单线线程表现更好)。我很想知道问题所在。Solaris线程是否有可能踩在另一个线程的浮点寄存器上?
有什么想法我如何调试?
问候
更新:
我更改了使用四尺寸(16个字节)加载的代码并保存:
.inline ProcessChunk,8
.volatile
/* copy state */
ldq [%o1], %f0
ldq [%o1 +16],%f4
/* copy data */
ldq [%o0], %f8
ldq [%o0+16],%f12
ldq [%o0+32],%f16
ldq [%o0+48],%f20
lzd %o0,%o0
nop
stq %f0, [%o1]
stq %f4, [%o1+16]
.end
乍一看,这个问题似乎已经消失了。32个线程后的性能会大大降低,因此这就是我坚持使用的数字(至少目前),并且使用当前代码,我似乎取得了正确的结果。我可能只是掩盖了这个问题,所以我将进行进一步的测试。
更新2:
我找到了一些时间回到这个问题,我能够从T4(一分钟内的10千万哈希)中获得体面的结果。
我所做的更改是:
- 使用的组件代替内联装配
- 由于功能是叶子功能,我没有触摸寄存器窗口
我把所有内容都包装在库中,并在此处提供了代码
不是火花架构专家(我可能错了),但这是我的猜测:
您的内联装配代码将堆栈变量加载到一组特定的浮点寄存器中,以便能够调用SHA Assembly操作。
这是如何适用于两个线程的?两个对ProcessChunk的调用都将尝试将不同的输入值复制到非常相同的CPU寄存器中。
我通常看到的方式是,ASM代码中的CPU寄存器就像高级编程语言的"全局"变量。
您的系统有几个核心?也许您很好,直到每个核心/一组硬件寄存器都有线程为止。但这也意味着代码的行为可能取决于线程安排在系统的不同核心上的方式。
您知道系统从CPU核心上的同一过程计划线程时的行为吗?我的意思是:系统是否在上下文开关中存储了未定义线程的寄存器?
我要进行的测试是催生等于CPU内核n的许多线程,然后使用n 1运行相同的测试(我的假设是每个CPU核心都有一个浮点寄存器集)。
- 在C++中使用cURL和多线程
- 多线程双缓冲区
- 为什么我的多线程作业队列崩溃
- 在main()之外初始化std::vector会导致性能下降(多线程)
- 试图创建一个多线程程序来查找0-100000000之间的总素数
- 为什么一个向量上的多线程操作很慢
- 学习多线程C++:添加线程不会使执行速度更快,即使它看起来应该
- 全局变量 多读取器 一个写入器多线程安全?
- boost::文件系统::recursive_directory_iterator多线程安全
- 如何阻止TensorFlow的多线程
- 如何在多线程中正确使用unique_ptr进行多态性?
- 并发/多线程:是否可以以这种方式生成相同的输出?
- sigwait() 在多线程程序中不起作用
- 多线程程序中出现意外的内存泄漏
- 静态 constexpr 类成员变量对多线程读取是否安全?
- 多线程比没有线程C++慢
- 具有 C++11 多线程的特征库
- 通过安装信号处理程序关闭多线程应用程序
- 成员变量在多线程 C++ 时自行更改
- 多线程直列组件