自己用CUDA做的简单的加密程式

这是偶们C++教材练习3中的加密解密题,现在移植到CUDA计算平台上面.
由于计算的数值比较小,而且出现多次内存host与显存device之间的数据复制,
因此这个CUDA程式会比CPU运算的慢不少.
                                      杨漱玉青Ruby

谢谢诸位来捧场啦...

[code]#include
#include
#include
#include

//#define THREAD_NUM 100
//#define BLOCK_NUM 1

__shared__ int num[7]/*={4,9,6,2,8,7,3}*/;  /*申请位于共享存储器中的空间,
                                                 考虑到这是固定的数值,
                                                 或许可以申请放到纹理存储器或者固定存储器中. */


bool InitCUDA()   //CUDA设备初始化
{
    int count;

    cudaGetDeviceCount(&count);
    if(count == 0)
    {
        fprintf(stderr, "There is no device.\n");
        return false;
    }

    int i;
    for(i = 0; i < count; i++)
    {
        cudaDeviceProp prop;
        if(cudaGetDeviceProperties(&prop, i) == cudaSuccess)
        {
            
            if(prop.major >= 1)
            {
                break;
            }

        }
    }

    if(i == count)
    {
        fprintf(stderr, "There is no device supporting CUDA 1.x.\n");
        return false;
    }

    cudaSetDevice(i);

    cudaDeviceProp prop;

    cudaGetDeviceProperties(&prop, i);

    printf("显卡GPU型号为:");
    printf("%s",prop.name);
    printf("\n");
    printf("支持的CUDA计算能力的版本为:");
    printf("%d",prop.major);
    printf(".%d",prop.minor);
    printf("\n");



    return true;
}

__global__ static void encryption(char *between,char *finall/*,int *cudatag*/)   //加密函数
{
    const int tid=threadIdx.x;
    //int num[7]={4,9,6,2,8,7,3};
    num[0]=4;num[1]=9;num[2]=6;num[3]=2;num[4]=8;num[5]=7;num[6]=3;
    between[tid]+=num[tid%7];

    if((between[tid]>=32)&&(between[tid]<=122))
        {
            finall[tid]=between[tid];
        }
    else
        {

            finall[tid]=(between[tid]-122)+32;
            //finall[tid]=((between[tid]%90)+32); //加密操作.
        }

    __syncthreads();

    //finall[tid]=(between[tid]-122)+32;
}
   



int main()
{

    if(!InitCUDA())
    {
        return 0;
    }

    printf("CUDA initialized.\n");

    char original[100];
    char *between;
    char *finall;

    int tag=0;
    //int *cudatag;
    int i;

    printf("请输入你想要加密的文字:");

    for(i=0;i<100;i++)  //原文
    {
        original[i]=getchar();
        if(original[i]=='\n')
        {
            tag=i;
            break;
        }
    }

    char hostfinall[100];  //存储加密后的值

    clock_t time2;
    clock_t time1=clock();

    cudaMalloc((void**) &between,sizeof(int)*tag);  //申请显存空间
    cudaMalloc((void**) &finall,sizeof(int)*tag);
    //cudaMalloc((void**) &cudatag,sizeof(int));  //标识数组大小变量

    //cudaMallocArray( struct cudaArray** array,const struct cudaChannelFormatDesc* desc,size_t width,size_t height )

    cudaMemcpy(between, original, sizeof(char)*tag, cudaMemcpyHostToDevice);  //数组复制
    //cudaMemcpy(cudatag,&tag,sizeof(int),cudaMemcpyHostToDevice);

    encryption<<<1,tag,7>>>(between,finall/*,cudatag*/);  //执行device部分

    cudaMemcpy(hostfinall,finall,sizeof(char)*tag,cudaMemcpyDeviceToHost);  //结果复制

    cudaFree(between);   //释放显存
    cudaFree(finall);
    //cudaFree(cudatag);
    time2=clock()-time1;

    printf("加密之后的文字为:");

    for(i=0;i<=tag;i++)
        printf("%c",hostfinall[i]);

    printf("\n");
    printf("GPU加密消耗的时间为:%d",time2);

    printf("\n");

    system("pause");
}[/code]


额,CPU版本的在这里:

[code]#include
#include
#include

using namespace std;

/*练习三加密解密作业,基于Visual Stdio 2008构建,希望我还能做出基于CUDA运算的版本.

                                                    杨漱玉青Ruby */

int main()
{
    char original[100];  //原文
    char between[100];  //中间.
    char finall[100]; //最终加密结果

    int module[100];  //解密时需要标记是否被模运算过

    int quotient[100]; /*记录其中模运算中的商值,为解密做准备,
                        这样的解密思想貌似不正确,或许可以穷举商,
                        来和原文逐一比较,不过这样会增加运算量,
                        但是却更贴近实际.*/

    int i,j;  //循环变量
    int tag; //标记输入了多少字符变量

    for(i=0;i<100;i++)   //初始化module数组
    {
        module[i]=0;
    }

    cout<
    for(i=0;i<100;i++)
    {
        original[i]=getchar();
        if(original[i]=='\n')
        {
            tag=i-1;
            break;
        }
    }

    char num[7]={4,9,6,2,8,7,3};  //加数

    j=0;

    clock_t time2;
    clock_t time1=clock();
    //加密操作

    for(i=0;i<=tag;i++)
    {
        between[i]=original[i]+num[j];  //加法操作

        j++;

        if(j==7)
            j=0;
    }

    for(i=0;i<=tag;i++)
    {
        if((between[i]>=32)&&(between[i]<=122))
        {
            finall[i]=between[i];
            module[i]=1;   //标记该数未被模运算过
        }
        else
        {
            quotient[i]=between[i]/90;  //存储商,做解密准备,此处有争议,或许是题目理解不正确.

            finall[i]=(between[i]-122)+32;
            //finall[i]=((between[i]%90)+32); //加密操作.
        }
    }
    //cout<
    time2=clock()-time1;

    cout<
    for(i=0;i<=tag;i++)
        cout<    cout<
    cout<
    //解密操作

    j=0;

    for(i=0;i<=tag;i++)   
    {
        if(module[i]==1)
        {
            between[i]=finall[i];
        }

        else if(module[i]==0)
        {
            //between[i]=((finall[i]-32)+quotient[i]*90);
            between[i]=(finall[i]-32)+122;
        }

        between[i]-=num[j];
        j++;

        if(j==7)
            j=0;

    }

    int tag2=0;

    for(i=0;i<=tag;i++)
    {
        if(original[i]!=between[i])
            tag2=1;
    }

    if(tag2)
    {
        cout<    else
    {
        cout<
        for(i=0;i<=tag;i++)
            cout<        cout<    }

    system("pause");

    return 0;
}[/code]

来自 “ ITPUB博客 ” ,链接:http://blog.itpub.net/22785983/viewspace-619575/,如需转载,请注明出处,否则将追究法律责任。

转载于:http://blog.itpub.net/22785983/viewspace-619575/

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值