回复:在 SSE2 CPU 上为 0.3.6 并行计算 4 个哈希
原始发布页
打开来源页面查看 1 个交叉存档
在 MinGW GCC 4.4.1 和 4.5.0 上,我都能让它在 test.cpp 中运行,但由 BitcoinMiner 调用时会发生 SIGSEGV。所以现在看来,这不像是 GCC 版本的问题,而是别的问题,也许只是栈如何对齐碰运气而已。
在 Ubuntu 32 位系统的 GCC 4.3.3 上,它运行得很好。
我找到了 MinGW 4.5.0 上 Crypto++ 的问题。下面是对应的补丁:
代码:
\--- \\old\\sha.cpp Mon Jul 26 13:31:11 2010
+++ ew\\sha.cpp Sat Aug 14 20:21:08 2010
@@ -336,7 +336,7 @@
ROUND(14, 0, eax, ecx, edi, edx)
ROUND(15, 0, ecx, eax, edx, edi)
\- ASL(1)
\+ ASL(label1) // Bitcoin: fix for MinGW GCC 4.5
AS2(add WORD\_REG(si), 4\*16)
ROUND(0, 1, eax, ecx, edi, edx)
ROUND(1, 1, ecx, eax, edx, edi)
@@ -355,7 +355,7 @@
ROUND(14, 1, eax, ecx, edi, edx)
ROUND(15, 1, ecx, eax, edx, edi)
AS2( cmp WORD\_REG(si), K\_END)
\- ASJ( jne, 1, b)
\+ ASJ( jne, label1, ) // Bitcoin: fix for MinGW GCC 4.5
AS2( mov WORD\_REG(dx), DATA\_SAVE)
AS2( add WORD\_REG(dx), 64)英文原文
展开英文原文
On both MinGW GCC 4.4.1 and 4.5.0 I have it working with test.cpp but SIGSEGV when called by BitcoinMiner. So now it doesn't look like it's the version of GCC, it's something else, maybe just the luck of how the stack is aligned.
I have it working fine on GCC 4.3.3 on Ubuntu 32-bit.
I found the problem with Crypto++ on MinGW 4.5.0. Here's the patch for that:
Code:
--- \old\sha.cpp Mon Jul 26 13:31:11 2010 +++ ew\sha.cpp Sat Aug 14 20:21:08 2010 @@ -336,7 +336,7 @@ ROUND(14, 0, eax, ecx, edi, edx) ROUND(15, 0, ecx, eax, edx, edi)
- ASL(1) + ASL(label1) // Bitcoin: fix for MinGW GCC 4.5 AS2(add WORD_REG(si), 4*16) ROUND(0, 1, eax, ecx, edi, edx) ROUND(1, 1, ecx, eax, edx, edi) @@ -355,7 +355,7 @@ ROUND(14, 1, eax, ecx, edi, edx) ROUND(15, 1, ecx, eax, edx, edi) AS2( cmp WORD_REG(si), K_END) - ASJ( jne, 1, b) + ASJ( jne, label1, ) // Bitcoin: fix for MinGW GCC 4.5
AS2( mov WORD_REG(dx), DATA_SAVE) AS2( add WORD_REG(dx), 64)