使用OMP并行化BLAKE存在很大问题。他们在规范中提到可以并行化“列步骤”和“对角线步骤”。我尝试这样做,但结果与我预期的相反(比单线程慢10倍)。我需要更多有经验的OMP用户的帮助,因为现在我不知道如何并行化这个循环:(
更新
我知道BLAKE的作者发布了BLAKE2,这是BLAKE的改进(更快)版本,但它与BLAKE有不同的实现(树哈希),这对我来说很难理解。我的任务是使用OMP比较单线程和多线程实现。所以我尝试在我理解的实现上执行此操作。我不是OMP的专家,我想以最简单的方式制作BLAKE多线程。我必须使用OMP正确实施,即使性能可能不会更好。 (抱歉我的英文,我希望你理解我) 这是我的代码的一部分:
#pragma omp parallel shared(n)
{
for(round=0; round<n; ++round)
{
/* column step, I want to run this 4 G32 functions in parallel, but don't know,
that is proper approach to this problem */
#pragma omp critical
G32( 0, 4, 8,12, 0);
#pragma omp critical
G32( 1, 5, 9,13, 1);
#pragma omp critical
G32( 2, 6,10,14, 2);
#pragma omp critical
G32( 3, 7,11,15, 3);
/* diagonal step, and same here */
#pragma omp critical
G32( 0, 5,10,15, 4);
#pragma omp critical
G32( 1, 6,11,12, 5);
#pragma omp critical
G32( 2, 7, 8,13, 6);
#pragma omp critical
G32( 3, 4, 9,14, 7);
}
}
这是G32功能:
#define G32(a,b,c,d,i)\
do { \
v[a] = ADD32(v[a],v[b])+XOR32(m[sigma[round][2*i]], c32[sigma[round][2*i+1]]);\
v[d] = ROT32(XOR32(v[d],v[a]),16);\
v[c] = ADD32(v[c],v[d]);\
v[b] = ROT32(XOR32(v[b],v[c]),12);\
v[a] = ADD32(v[a],v[b])+XOR32(m[sigma[round][2*i+1]], c32[sigma[round][2*i]]);\
v[d] = ROT32(XOR32(v[d],v[a]), 8);\
v[c] = ADD32(v[c],v[d]);\
v[b] = ROT32(XOR32(v[b],v[c]), 7);\
} while (0)
答案 0 :(得分:2)
我认为他们想到的那种并行化就是利用现代CPU下的SIMD指令。在这种情况下,OMP样式并行化的问题有两个: