这是偶们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/