多线程直列组件

Multithreaded inline assembly

本文关键字:组件 多线程      更新时间:2023-10-16

我正在尝试在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千万哈希)中获得体面的结果。

我所做的更改是:

  1. 使用的组件代替内联装配
  2. 由于功能是叶子功能,我没有触摸寄存器窗口

我把所有内容都包装在库中,并在此处提供了代码

不是火花架构专家(我可能错了),但这是我的猜测:

您的内联装配代码将堆栈变量加载到一组特定的浮点寄存器中,以便能够调用SHA Assembly操作。

这是如何适用于两个线程的?两个对ProcessChunk的调用都将尝试将不同的输入值复制到非常相同的CPU寄存器中。

我通常看到的方式是,ASM代码中的CPU寄存器就像高级编程语言的"全局"变量。

您的系统有几个核心?也许您很好,直到每个核心/一组硬件寄存器都有线程为止。但这也意味着代码的行为可能取决于线程安排在系统的不同核心上的方式。

您知道系统从CPU核心上的同一过程计划线程时的行为吗?我的意思是:系统是否在上下文开关中存储了未定义线程的寄存器?

我要进行的测试是催生等于CPU内核n的许多线程,然后使用n 1运行相同的测试(我的假设是每个CPU核心都有一个浮点寄存器集)。