GPU 编程第三次作业(实验四)
GPU 编程第三次作业(实验四)
1. 熟悉常用内存操作
-
memset
函数:将一段内存空间的每个字节都设置为指定的值。void *memset(void *ptr, int value, size_t num);
这个函数的参数包括:
ptr
:指向要设置的内存空间的指针;value
:要设置的值,可以是任意的int
类型的值(通常用0
);num
:要设置的字节数。
-
memcpy
函数:将源内存区域的内容拷贝到目标内存区域,可以处理任意类型的数据。void *memcpy(void *dest, const void *src, size_t n);
这个函数的参数包括:
dest
:指向目标内存区域的指针;src
:指向源内存区域的指针;n
:要拷贝的字节数。
注释前:
注释后:
解释:如果没有用 memset
来赋值的话,字符串都为空,所以就有如上结果。
2 实现内存分配函数
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#define N 10
void _hostMalloc(void** p,size_t size){ *p=malloc(size); }
int main()
{
int *numbers = NULL;
_hostMalloc((void **)&numbers, N*sizeof(int));
memset(numbers, 0, N*sizeof(int));
for(int i=0; i<N; i++){ printf("%d ", numbers[i]); }
printf("\n");
char *strings = NULL;
_hostMalloc((void **)&strings, N*sizeof(char));
memset(strings, 'A', N*sizeof(char));
for(int i=0; i<N; i++){ printf("%c ", strings[i]); }
free(numbers);
free(strings);
return 0;
}
3 字符加密GPU版
//完成代码
#include"error_check.h"
#include <stdio.h>
#define PWD 3
__global__ void entrypt_p(char *in, char *out)
{
int idx = threadIdx.x;
out[idx] = in[idx] + PWD;
}
int main()
{
char A[] = "Hello, world!";
int memSize = strlen(A)*sizeof(char);
int strLen = strlen(A);
char *B = (char *)malloc(memSize);
printf("Input: \n");
for(int i=0; i<strLen; i++){printf("%c ", A[i]);}
//Todo
char *d_A=NULL;
char *d_B=NULL;
CHECK(cudaMalloc((void **)&d_A, memSize));
CHECK(cudaMalloc((void **)&d_B, memSize));
CHECK(cudaMemcpy(d_A, A, memSize, cudaMemcpyHostToDevice));
entrypt_p<<<1, strlen(A)>>>(d_A, d_B);
CHECK(cudaMemcpy(B, d_B, memSize, cudaMemcpyDeviceToHost));
printf("\nOutput: \n");
for(int i=0; i<strLen; i++){printf("%c ", B[i]);}
return 0;
}
运行结果:
4 文本加密解密工具GPU版
//Encrypt.cu的主函数to do部分
char *A,*B,*C;
CHECK(cudaMalloc((void**)&A,lenStr*sizeof(char)));
CHECK(cudaMalloc((void**)&B,lenStr*sizeof(char)));
CHECK(cudaMemcpy(A,inputStr,lenStr*sizeof(char),cudaMemcpyHostToDevice));
printf("Encrypting using GPU...\n");
encrypt_gpu<<<ceil(lenStr/32),32>>>(A,B,lenStr,pwd);
C=(char*)malloc(lenStr*sizeof(char));
CHECK(cudaMemcpy(C,B,lenStr*sizeof(char),cudaMemcpyDeviceToHost));
WriteFile(output_file,C,read_size);
printf("Encrypted message has been saved to output.txt");
// Write to output file
// WriteFile(output_file, h_encryptedStr_from_gpu, read_size);
//Decrypt.cu的主函数to do部分
char *A,*B,*C;
CHECK(cudaMalloc((void**)&A,lenStr*sizeof(char)));
CHECK(cudaMalloc((void**)&B,lenStr*sizeof(char)));
CHECK(cudaMemcpy(A,inputStr,lenStr*sizeof(char),cudaMemcpyHostToDevice));
printf("Decrypting using GPU...\n");
decrypt_gpu<<<ceil(lenStr/32),32>>>(A,B,lenStr,pwd);
C=(char*)malloc(lenStr*sizeof(char));
CHECK(cudaMemcpy(C,B,lenStr*sizeof(char),cudaMemcpyDeviceToHost));
WriteFile(output_file,C,read_size);
printf("Decrypted message has been saved to output.txt");
// Write to output file
// WriteFile(output_file, h_encryptedStr_from_gpu, read_size);
结果:
![image-20230329193136354](https://s1.imagehub.cc/images/2023/03/29/46cab6798eb923c3d7b014431b320cc6.png)
![image-20230329193159152](https://s1.imagehub.cc/images/2023/03/29/589e367e18ee74a6628dc7572cdca8c7.png)