【IT168 文档】
在运用cuda进行md5crack的时候,遇到一个问题,既cuda是并行的,他不向cpu那样会一句一句的执行。因此在执行过程中有用的线程在当前grid中的索引就显得很重要,那为我们生成md5的字典起到了非常重要的作用。
但是,也因为他的串行,很多事情不像cpu那样方便了,因为我们必须从gpu的角度去看问题。现在就让我们看一下具体的问题。
在这个运算的过程中,比如我们传给gpu的起始字符串是abcd,然后线程索引是123,我们就要得到当前线程应该跑的密码是那个呢?不能直接去算吧?好,那我换个思路来想。如果我把abcd看成是一个数组,对应的数组的值是1 2 3 4 那不是好解决了嘛 1234+123肯定很简单吧。。。
下面就是我测试程序
#include<stdio.h>
const int base = 10;//这里模拟整个字符串的长度
int main(){
int index[5]={0};//模拟传递进来的起始字符串
int k;
for ( k = 0;k<5;k++)
{
printf("please input number %d :/>",k);
scanf("%d",&index[k]);
}
int numner;//模拟当前线程索引
printf("please input number you want add : \>");
scanf("%d",&numner);
int ii=0;
while(++ii<5)
{
if (numner<base)//判断线程索引是否大于基本字符串的长度
{
if (index[ii]+numner<base)//小于,则判断当前位置的值+numner过后是否大于字符串长度。既十进制中的判断是否有进位
{
index[ii]=index[ii]+numner;//赋新值
}
else
{
index[ii]= (index[ii]+numner%base)%base;//形如9+8=17那么个位的值就是7
index[ii+1]++;//进位
}
}
else
{
if (index[ii]+numner%base>=base)//判断是否会存在进位
{
index[ii+1]++;//有进位,加一
}
index[ii]=(index[ii]+numner)%base; //同前一个else的值。
}
numner=numner/base;//下一轮循环前,先移位,十进制中的算法
}
}
const int base = 10;//这里模拟整个字符串的长度
int main(){
int index[5]={0};//模拟传递进来的起始字符串
int k;
for ( k = 0;k<5;k++)
{
printf("please input number %d :/>",k);
scanf("%d",&index[k]);
}
int numner;//模拟当前线程索引
printf("please input number you want add : \>");
scanf("%d",&numner);
int ii=0;
while(++ii<5)
{
if (numner<base)//判断线程索引是否大于基本字符串的长度
{
if (index[ii]+numner<base)//小于,则判断当前位置的值+numner过后是否大于字符串长度。既十进制中的判断是否有进位
{
index[ii]=index[ii]+numner;//赋新值
}
else
{
index[ii]= (index[ii]+numner%base)%base;//形如9+8=17那么个位的值就是7
index[ii+1]++;//进位
}
}
else
{
if (index[ii]+numner%base>=base)//判断是否会存在进位
{
index[ii+1]++;//有进位,加一
}
index[ii]=(index[ii]+numner)%base; //同前一个else的值。
}
numner=numner/base;//下一轮循环前,先移位,十进制中的算法
}
}
但是这个算法还有很多不足,比如复杂度等,如果有哪位高手能帮改进 先谢了