Optimization 用cuda优化rc4

Optimization 用cuda优化rc4,optimization,cuda,implementation,Optimization,Cuda,Implementation,我尝试在cuda中实现一个高效的rc4密码算法。我使用共享内存来存储内部排列状态,通过在warp中进行并行线程访问来处理倾斜内存布局,以减少时间开销。我还试图利用具有“I”索引的读/写访问是连续的并且可以打包在32位字中这一事实来最小化访问数量。最后,我使用常量内存初始化置换状态 尽管有这些“聪明”的诀窍,但我可以期望实现的吞吐量仅为最佳报告实现的50%左右(例如,请参阅guapdf cracker),即使考虑到主机和gpu之间的未阻塞通信可以用于部分覆盖计算。我不明白为什么,我正在寻找新的改进

我尝试在cuda中实现一个高效的rc4密码算法。我使用共享内存来存储内部排列状态,通过在warp中进行并行线程访问来处理倾斜内存布局,以减少时间开销。我还试图利用具有“I”索引的读/写访问是连续的并且可以打包在32位字中这一事实来最小化访问数量。最后,我使用常量内存初始化置换状态

尽管有这些“聪明”的诀窍,但我可以期望实现的吞吐量仅为最佳报告实现的50%左右(例如,请参阅guapdf cracker),即使考虑到主机和gpu之间的未阻塞通信可以用于部分覆盖计算。我不明白为什么,我正在寻找新的改进想法或对我本可以做出的错误假设的评论

这里是我的KSA(密钥设置)内核的一个玩具实现,密钥减少到4个字节

\uuuuu常量\uuuuuu无符号整数c\u init[256*32/4];
__全局无效rc4Block(无符号整数*d_输出,无符号整数*d_输入)
{
__共享的无符号整数s_数据[256*32/4];
int inOffset=blockDim.x*blockIdx.x;
int in=inOffset+threadIdx.x;
无符号整数键,u;
//初始化
key=d_in[in];
对于(int i=0;i>8)&0xFF;
无符号字符k2=(键>>8)&0xFF;
无符号字符k3=(键>>8)&0xFF;
对于(int i=0;i>shiftj)&0xff;
si=(si&0xffffff00)| v;
sj=(sj&~(0xffu8)&0xff;
j=(j+k1+u)&0xFF;
sj=s_数据[(j/4)*32+threadIdx.x];
位移j=8*(j%4);
v=(sj>>shiftj)&0xff;
si=(si&0xffff00ff)|(v shiftj)&0xff;
si=(si&0xff00ffff)|(v移位)和0xff;

si=(si&0xffffff)|(v代码似乎至少部分涉及对字节的重新排序。如果您使用的是费米类GPU,您可以研究使用u byte_perm()内在函数,该函数映射到费米类设备上的硬件指令,并允许更有效地对字节重新排序


我假设,与其他实现相比,它是苹果对苹果的,即在同一类型的GPU上。此代码看起来完全受计算限制,因此吞吐量在很大程度上取决于GPU的整数指令吞吐量,并且性能范围很广。

似乎代码至少部分涉及字节重新排序。如果y如果您使用的是费米类GPU,您可以研究使用_byte_perm()内在函数,该函数映射到费米类设备上的硬件指令,并允许更有效地重新排序字节


我假设,与其他实现相比,它是苹果对苹果的,即在同一类型的GPU上。这段代码看起来完全受计算限制,因此吞吐量在很大程度上取决于GPU的整数指令吞吐量,而且性能范围很广。

实际上,我是在旧的“特斯拉”体系结构下工作的,所以ntrinsic(知道这一点似乎很好)无法使用。我使用相同的gpu卡进行的基准计时确认了我的性能比较。我在Schneier中查找了RC4,它是一种面向字节的算法,使用由256个单字节条目组成的SBOX。您的代码似乎一次访问一个字的字节数组,并动态提取和插入字节。这些提取/插入在这个受计算限制的任务中,异常操作似乎占据了整个执行时间的很大一部分。您是否考虑过将每个SBOX元素存储在一个字中,只在写每个SBOX条目时屏蔽到最低有效字节?此外,尝试通过字符数组而不是字数组使用输入数据。实际上,我正在工作在较旧的“特斯拉”体系结构下的ing,因此具有字节perm固有特性(这似乎很好知道)无法使用。我使用相同的gpu卡进行的基准计时确认了我的性能比较。我在Schneier中查找了RC4,它是一种面向字节的算法,使用由256个单字节条目组成的SBOX。您的代码似乎一次访问一个字的字节数组,并动态提取和插入字节。这些提取/插入在这个受计算限制的任务中,异常操作似乎占据了整个执行时间的很大一部分。您是否考虑过将每个SBOX元素存储在一个字中,只在写回每个SBOX条目时屏蔽到最低有效字节?此外,尝试通过字符数组而不是字数组使用输入数据。