GPU 编程第三次作业(实验四)

发布时间 2023-03-29 20:02:38作者: 缙云山车神

GPU 编程第三次作业(实验四)

1. 熟悉常用内存操作

  1. memset 函数:将一段内存空间的每个字节都设置为指定的值。

    void *memset(void *ptr, int value, size_t num);
    

    这个函数的参数包括:

    • ptr:指向要设置的内存空间的指针;
    • value:要设置的值,可以是任意的 int 类型的值(通常用 0);
    • num:要设置的字节数。
  2. memcpy 函数:将源内存区域的内容拷贝到目标内存区域,可以处理任意类型的数据。

    void *memcpy(void *dest, const void *src, size_t n);
    

    这个函数的参数包括:

    • dest:指向目标内存区域的指针;
    • src:指向源内存区域的指针;
    • n:要拷贝的字节数。

注释前:

注释后:image-20230329104448764

解释:如果没有用 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;
}

运行结果:

image-20230329181453974

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 image-20230329193159152