Nghiên cứu công nghệ xử lý GPU và ứng dụng

98 264 1
Nghiên cứu công nghệ xử lý GPU và ứng dụng

Đang tải... (xem toàn văn)

Tài liệu hạn chế xem trước, để xem đầy đủ mời bạn chọn Tải xuống

Thông tin tài liệu

i ĐẠI HỌC THÁI NGUYÊN ĐẠI HỌC CÔNG NGHỆ THÔNG TIN VÀ TRUYỀN THÔNG ĐINH TIẾN NGỌC NGHIÊN CỨU CÔNG NGHỆ XỬ LÝ GPU VÀ ỨNG DỤNG THÁI NGUYÊN 2017 ii LỜI CAM ĐOAN Tôi xin cam đoan : Những nghiên cứu luận văn hoàn toàn trung thực không vi phạm quyền sở hữu trí tuệ Nếu sai xin chịu hoàn toàn trách nhiệm TÁC GIẢ LUẬN VĂN Đinh Tiến Ngọc iii LỜI CẢM ƠN Lời xin chân thành cảm ơn đếnTS Lê Quang Minh người thầy tận tình giúp đỡ, hướng dẫn hoàn thành luận văn Tôi xin chân thành cảm ơn thầy, cô giảng viên cao học người giúp đỡ nâng cao kiến thức giúp có kiến thức bổ trợ giúp hoàn thiện cho luận văn Tôi xin chân thành cảm ơn người thân, bạn bè giúp đỡ động viên suốt thời gian học tập thời gian thực đề tài Xin chân thành cảm ơn! Thái Nguyên, ngày tháng năm 2017 TÁC GIẢ LUẬN VĂN Đinh Tiến Ngọc iv DANH MỤC THUẬT NGỮ TiếngAnh TiếngViệt GPU Bộ xử lý đồ họa gpgpu Tính toán thông dụng GPU API Application Program Interface : Định nghĩa giao diện chuẩn để triệu gọi tập chức coproccessor đồng xử lý kernel hạt nhân texture Kết cấu: cấu trúc đối tượng, xem mô hình thu nhỏ đối tượng texturefetches Hàm đọc kết cấu texturereference Tham chiếu kết cấu warp Mỗi khối tách thành nhóm SIMD luồng SIMD Single Instruction Multiple Data: đơn lệnh đa liệu stream Dòng streamingprocessor Bộ xử lý dòng MIMD Multiple Instruction Multiple Data: đa lệnh đa liệu primarysurface Bề mặt proccessor Bộ xử lý Rasterization Sự quét mành hình v MỤC LỤC LỜI CAM ĐOAN i LỜI CẢM ƠN iii DANH MỤC THUẬT NGỮ iv MỤC LỤC v DANH MỤC HÌNHVẼ vii LỜI MỞ ĐẦU viii CHƯƠNG I : KHÁI QUÁT VỀ BỘ XỬ LÝ ĐỒ HỌA GPU VÀ XỬ LÝ SONG SONG 1.1 Khái quát xử lý song song 1.1.1 Khái quát xử lý song song 1.1.2 Khái quát Hệ thống máy tính song song 1.1.3 Khái quát lập trình song song 1.1.4 Các nguyên tắc thiết kế giải thuật xử lý song song 1.2 Khái quát công nghệ GPU ứng dụng 10 1.2.1 Tổng quan GPU 11 1.2.2 Nguồn gốc trình phát triển GPU 11 1.2.3 Cấu trúc xử lý đồ họa GPU 15 1.2.4 Lập trình GPU 19 1.2.5 Các hỗ trợ phần mềm cho xử lý tính toán GPU 22 1.2.6 Các kỹ thuật tính toán GPU 26 1.2.7.Các giải thuật ứng dụng GPU 29 CHƯƠNG II: XỬ LÝ SONG SONG TRÊN THIẾT BỊ ĐỒ HỌA GPU VỚI CUDA 31 2.1 Khái quát CUDA 31 2.2.Cơ chế lập trình cách thức hoạt động CUDA 33 2.2.1.Cơ chế lập trình 33 2.2.2.Cách thức hoạt động CUDA 33 2.3 Tổng quan lập trình với CUDA 38 2.3.1 Là ngôn ngữ lập trình mở rộng ngôn ngữ lập trình C 38 vi 2.3.2 Các phần mở rộng CUDA 38 2.3.3.Biến Built-in CUDA 41 2.3.4 Biên dịch CUDA thông qua NVCC 42 2.3.5.Một số trường hợp cụ thể tính toán song song CUDA 42 2.4 Các ứng dụng CUDA lĩnh vực 45 2.4.1 Ứng dụng CUDA game 45 2.4.2 Ứng dụng CUDA với video số 45 CHƯƠNG III: SỬ DỤNG GPU ĐỂ LÀM TĂNG TỐC ĐỘ TÍNH TOÁN CHO BÀI TOÁN MÃ HÓA AES 48 3.1 Giới thiệu AES 48 3.2 Thuật toán mã hóa 48 3.2.1 Công đoạn mã hóa 50 3.2.2 Công đoạn giải mã 54 3.3 Chương trình thuật toán song song mã hóa AES sử dụng GPU 62 3.3.1 Giao diện chương trình demo 92 3.3.2 Kết chương trình đánh giá hiệu suất tính toán 93 KẾT LUẬN 88 TÀI LIỆU THAM KHẢO 89 vii DANH MỤC HÌNHVẼ Hình : Kiến trúc Von Neumann Hình : Máy tính song song có nhớ chia sẻ Hình : Máy tính song song có nhớ phân tán Hình : Kiến trúc máy SISD Hình : Kiến trúc máy SIMD Hình : Kiến trúc máy MISD Hình : Kiến trúc máy MIMD Hình : Mô hình lập trình truyền thông hai tác vụ hai máy tính Hình : Mô hình lập trình song song liệu Hình10: Kiến trúc GPU NVIDIA AMD 19 Hình 11: Kiến trúc phần mềm CUDA 31 Hình 12: Thao tác cấp phát thu hồi nhớ 32 Hình 13: Vùng nhớ dùng chung mang liệu gần ALU 33 Hình 14: Sơ đồ hoạt động truyền liệu Host Device 34 Hình 15: Khối luồng 36 Hình 16: Mô hình nhớ GPU 37 Hình 17: Chiều lưới khối với số khối luồng 42 Hình 18: Phương pháp đánh số luồng 45 Hình 19 : Mã hóa giải mã 49 Hình 20: Biến đổi SubBytes() mảng trạng thái 51 Hình 21: Mô tả Hàm ShiftRows() 51 Hình 22: Mô tả hàm MixColumns() 52 Hình 23: Mô tả hàm AddRoundKey() 53 Hình 24: Mô tả hàm InvShiftRow() 55 viii LỜI MỞ ĐẦU Với phát triển vũ bão công nghệ, ngày công nghệ thông tin trở thành phần thiếu sống Không công cụ hữu hiệu ngành khoa học, công nghệ cao,… đặc biệt ngành có nhu cầu tính toán lớn Tuy nhiên với nhu cầu tính toán ngày cành tăng cao đó, ngành công nghệ thông tin lại vấp phải vấn đề tối quan trọng lực xử lý CPU có hạn Các nhà phát triển phần cứng thực gia tăng mức độ xử lý cho CPU cách gia tăng xung cho CPU Tuy nhiên việc chạm ngưỡng gặp phải vấn đề tản nhiệt cho CPU nhiệt độ CPU cao Một hướng nhà nghiên cứu đưa phát triển xử lý đa nhân với chế xử lý song song Một bước phát triển hướng xử lý đồ họa – GPU (Graphics Processing Unit - xử lý đồ họa) Khi đời, GPU sử dụng với mục đích công việc phù hợp với khả tăng tốc độ xử lý đồ họa, ngành trò chơi chủ yếu Nhưng với phát triển dần trò chơi phần mềm đồ họa, khiến GPU phát triển thêm đến hệ GPUNV30 NVIDIA đời người ta bắt đầu phát triển công việc khác cho GPU hỗ trợ tính toán dấu chấm động đơn, hỗ trợ tính toán lên ngàn lệnh Và đặc biệt với tiềm nghĩ tới việc sử dụng GPU đồ họa Cùng với ý tưởng liên tưởng đến việc áp dụng việc xử lý song song GPU thông qua ngôn ngữ lập trình CUDA Xuất phát từ ý tưởng chọn đề tài: NGHIÊN CỨU CÔNG NGHỆ XỬ LÝ GPU VÀ ỨNG DỤNG Luận văn gồm chương chính: Chương 1: Khái quát xử lý đồ họa GPU xử lý song song, Chương giới thiệu tổng quan xử lý song song xử lý đồ họa GPU Chương 2: Xử lý song song thiết bị đồ họa GPU với CUDA Chương nghiên cứu ngôn ngữ lập trình CUDA cách xử lý song song CUDA GPU Chương 3: Sử dụng GPU để làm tăng tốc độ tính toán cho toán mã hóa ix AES Chương tiến hành cài đặt thử chương trình song song, xử lý song song mã hóa AES GPU ngôn ngữ CUDA đưa kết kết luận hiệu suất GPU CHƯƠNG I : KHÁI QUÁT VỀ BỘ XỬ LÝ ĐỒ HỌA GPU VÀ XỬ LÝ SONG SONG 1.1 Khái quát xử lý song song 1.1.1 Khái quát xử lý song song Nguồn gốc đời xử lý songsong Một tảng máy tính thiết kế máy tính John Von Neumann Đó thiết kế mà lệnh thực xử lý Hình1: Kiến trúc Von Neumann Khi cần tính toán với lượng câu lệnh phép tính lớn thiết kế trở nên lỗi thời Người ta đưa phương pháp nhằm giải vấn đề Trong có việc tăng số lượng nhân xử lý kết nối nhiều máy tính thông qua mạng để tăng tốc độ xử lý Khi tăng tốc xử lý phép tính máy tính song song, việc sử dụng thuật toán không thích hợp không tận dụng hết khả tiềm tàng máy tính song song Dẫn đến việc đời giải thuật song song Lý phải xử lý song song Như nói máy tính song song với xử lý nhiều nhân thay dần máy tính đơn nhân, xử lý Và với thuật toán, câu lệnh, phép xử lý không phù hợp với máy tính song song Do xử lý song song đời thay cho xử lý nhằm đem lại hiệu tính toán cao Bằng chứng thấy thực tế với nhiều toán xử lý với lượng liệu lớn 75 for (i = 0; i < KEYWORDS; ++i) { roundKey[(i * 4) + 0] = key[(i * 4) + 0]; roundKey[(i * 4) + 1] = key[(i * 4) + 1]; roundKey[(i * 4) + 2] = key[(i * 4) + 2]; roundKey[(i * 4) + 3] = key[(i * 4) + 3]; } // All other round keys are found from the previous round keys for (; (i < (LANESIZE * (ROUNDS + 1))); ++i) { for (j = 0; j < 4; ++j) { tempa[j] = roundKey[(i - 1) * + j]; } if (i % KEYWORDS == 0) { // This function rotates the bytes in a word to the left once // [a0,a1,a2,a3] becomes [a1,a2,a3,a0] // Function RotWord() { k = tempa[0]; tempa[0] = tempa[1]; tempa[1] = tempa[2]; tempa[2] = tempa[3]; tempa[3] = k; } // SubWord() is a function that takes a four-byte input word and // applies the S-box to each of the four bytes to produce an output word // Function Subword() { tempa[0] = getSBoxValue(tempa[0]); 76 tempa[1] = getSBoxValue(tempa[1]); tempa[2] = getSBoxValue(tempa[2]); tempa[3] = getSBoxValue(tempa[3]); } tempa[0] = tempa[0] ^ Rcon[i / KEYWORDS]; } else if (KEYWORDS > && i % KEYWORDS == 4) { // Function Subword() { tempa[0] = getSBoxValue(tempa[0]); tempa[1] = getSBoxValue(tempa[1]); tempa[2] = getSBoxValue(tempa[2]); tempa[3] = getSBoxValue(tempa[3]); } } roundKey[i * + 0] = roundKey[(i - KEYWORDS) * + 0] ^ tempa[0]; roundKey[i * + 1] = roundKey[(i - KEYWORDS) * + 1] ^ tempa[1]; roundKey[i * + 2] = roundKey[(i - KEYWORDS) * + 2] ^ tempa[2]; roundKey[i * + 3] = roundKey[(i - KEYWORDS) * + 3] ^ tempa[3]; } } // XOR the round key on state static void AddRoundKey(uint8_t round) { uint8_t i, j; for (i = 0; i 7) & 1) * 0x1b)); } // MixColumns function mixes the columns of the state matrix static void MixColumns(void) { uint8_t i; uint8_t Tmp, Tm, t; for (i = 0; i < 4; ++i) { t = (*state)[i][0]; Tmp = (*state)[i][0] ^ (*state)[i][1] ^ (*state)[i][2] ^ (*state)[i][3]; Tm = (*state)[i][0] ^ (*state)[i][1]; Tm = xtime(Tm); Tm ^ Tmp; (*state)[i][0] ^= Tm = (*state)[i][1] ^ (*state)[i][2]; Tm = xtime(Tm); Tm ^ Tmp; (*state)[i][1] ^= Tm = (*state)[i][2] ^ (*state)[i][3]; Tm = xtime(Tm); Tm ^ Tmp; (*state)[i][2] ^= Tm = (*state)[i][3] ^ t; Tm = xtime(Tm); Tmp; } } static uint8_t Multiply(uint8_t x, uint8_t y) { return (((y & 1) * x) ^ ((y >> & 1) * xtime(x)) ^ (*state)[i][3] ^= Tm ^ 79 ((y >> & 1) * xtime(xtime(x))) ^ ((y >> & 1) * xtime(xtime(xtime(x)))) ^ ((y >> & 1) * xtime(xtime(xtime(xtime(x)))))); } // Cipher is the main function that encrypts the PlainText static void Cipher(void) { uint8_t round = 0; // Add the First round key to the state before starting the rounds AddRoundKey(0); //print_state(); // There will be ROUNDS rounds // The first ROUNDS-1 rounds are identical // These ROUNDS-1 rounds are executed in the loop below for (round = 1; round < ROUNDS; ++round) { SubBytes(); ShiftRows(); MixColumns(); AddRoundKey(round); } // The last round is given below // The MixColumns function is not here in the last round SubBytes(); ShiftRows(); AddRoundKey(ROUNDS); } static void BlockCopy(uint8_t* output, uint8_t* input) { uint8_t i; 80 for (i = 0; i 4) { printf("Usage: aes_serial.exe [ silent]\n", argv[0]); return 1; } if (argc == 4) if (!strcmp(argv[3], " silent")) silent = 1; double cpu_time_used; cpu_time_used = encrypt_file(argv[1], argv[2]); printf("Execution time: %6.9f seconds\n", cpu_time_used); return 0; } (uint8_t)0x09, (uint8_t)0xcf, (uint8_t)0x4f, (uint8_t)0x3c }; 82 double encrypt_file(char* infile, char* outfile) { FILE *fp_in; FILE *fp_out; fp_in = fopen(infile, "rb"); if (fp_in == NULL && !silent) { fprintf(stderr, "Can't open input file %s!\n", infile); exit(1); } fp_out = fopen(outfile, "wb+"); if (fp_out == NULL && !silent) { fprintf(stderr, "Can't open output file %s!\n", outfile); exit(1); } KeyExpansion(roundKey, key); #if defined(DEBUG) && DEBUG printf("Round Keys:\n"); uint8_t i; for (i = 0; i < ROUNDS + 1; i++) { phex(roundKey + (i * ROUNDS)); } #endif // determine size of file, read file into plaintext and determine number of plaintext blocks fseek(fp_in, 0, SEEK_END); uintmax_t plaintext_size = ftell(fp_in); rewind(fp_in); uint8_t* plaintext = (uint8_t*)malloc(plaintext_size); uintmax_t bytes_read = fread(plaintext, sizeof(uint8_t), plaintext_size, fp_in); assert(bytes_read == plaintext_size); uintmax_t plaintext_blocks = (bytes_read + BLOCKSIZE - 1) / BLOCKSIZE; uint8_t* ciphertext = (uint8_t*)malloc(plaintext_blocks*BLOCKSIZE); 83 if (!silent) { printf("File size: %llu bytes\n", plaintext_size); printf("Number of plaintext plaintext_blocks, BLOCKSIZE); blocks: %llu (blocksize: %d bytes)\n", } #if defined(DEBUG) && DEBUG printf("Plaintext:\n"); for (i = 0; i < plaintext_blocks; i++) { phex(plaintext + (i * BLOCKSIZE)); } #endif // measure time double cpu_time_used; LARGE_INTEGER frequency; LARGE_INTEGER start, end; QueryPerformanceFrequency(&frequency); // start timer QueryPerformanceCounter(&start); uintmax_t j; for (j = 0; j < plaintext_blocks; j++) { // encrypt plaintext block AES128_ECB_encrypt(plaintext + j*BLOCKSIZE, roundKey, ciphertext_block); // write ciphertext block to output file memcpy(ciphertext sizeof(uint8_t)*BLOCKSIZE); } // stop timer QueryPerformanceCounter(&end); + j*BLOCKSIZE, ciphertext_block, 84 cpu_time_used = ((double)(end.QuadPart ((double)frequency.QuadPart); - start.QuadPart)) / // write ciphertext to output file fwrite(ciphertext, sizeof(uint8_t), BLOCKSIZE * plaintext_blocks, fp_out); #if defined(DEBUG) && DEBUG printf("Ciphertext:\n"); for (i = 0; i < plaintext_blocks; i++) { phex(ciphertext + (i * BLOCKSIZE)); } #endif fclose(fp_in); fclose(fp_out); if (!silent) printf("Encryption plaintext_blocks); of %llu plaintext blocks successful!\n", return cpu_time_used; } // Reads one block of plaintext of size BLOCKSIZE bytes from the file pointed to by the pointer fp // If the last block does not match BLOCKSIZE bytes, the block is padded with zero bytes static size_t read_plaintext_block(FILE *fp) { size_t current_blocksize = fread(plaintext_block, sizeof(uint8_t), BLOCKSIZE, fp); #if defined(DEBUG) && DEBUG if (feof(fp)) printf("End-of-File reached.\n"); if (ferror(fp)) printf("An error occurred while accessing the file.\n"); if (current_blocksize == 0) return 0; //printf("current_blocksize: %d\n", current_blocksize); 85 #endif if (current_blocksize == 0) return 0; // pad last block with zeroes if it does not match BLOCKSIZE if (current_blocksize < BLOCKSIZE) { uint8_t i; for (i = 0; current_blocksize + i < BLOCKSIZE; ++i) { plaintext_block[current_blocksize + i] = '0'; } } return current_blocksize; } // prints string as hex static void phex(uint8_t* str) { unsigned char i; for(i = 0; i < 16; ++i) printf("%.2x", str[i]); printf("\n"); } 86 3.3.1 Giao diện chương trình demo: Chạy CPU: Chạy GPU: 87 3.3.2 Kết chương trình đánh giá hiệu suất tính toán: Ta dễ thấy GPU có hiệu suất tính toán cao hẳn so với CPU Kích cỡ file đầu vào Thời gian chạy CPU Thời gian chạy GPU 664911 bytes 0.941079536 seconds 0.265264969 seconds 1189270 bytes 1.064967493 seconds 0.188594010 seconds 4337261 bytes 2.624178762 seconds 0.317496639 seconds 8132164 bytes 5.940836913 seconds 0.444080242 seconds 25724901 bytes 14.598369270 seconds 0.981748010 seconds Hướng phát triển Với toán thử nghiệm luận văn cho thấy liệu đầu vào dung lượng lớn việc chạy GPU cho tốc độ tính toán nhanh nhiều lần so với tiến hành CPU Ngày với phát triển ngành khoa học, dịch vụ internet thương mại nhu cầu tính toán lớn Việc phát triển, cài đặt thuật toán nhiều GPU nhu cầu có thực cấp thiết Trong tương lai tác giả tiếp tục nghiên cứu phát triển cài đặt thuật toán, phương pháp mã hóa khác tảng GPU 88 KẾT LUẬN Luận văn nghiên cứu tổng quan xử lý song song Đồng thời luận văn nghiên cứu xử lý đồ họa GPU, công cụ lập trình GPU phổ biến CUDA Đó tiền đề để nghiên cứu cách xử lý song song xử lý đồ họa GPU cho hiệu Trong chương luận văn trình bày cách thuật toán mã hóa tương đối thuật toán mã hóa AES Với kiến thức nghiên cứu tổng hợp luận văn Tác giả đưa chương trình thực nghiệm song song xử lý mã hóa AES với GPU thông qua công cụ lập trình CUDA Và so sánh với chương trình mã hóa AES chương trình xử lý GPU Trên kết nghiên cưu thông qua liệu đầu vào từ nhỏ lớn dần cho thấy khác biệt hiệu rõ rệt sử dụng GPU Với kết dựa nghiên cứu tổng quan công nghệ GPU CUDA kết chương trình thực nghiệm Hy vọng giúp đưa giải pháp cho nhà quản lý nhà phát triển phần cứng phần mềm để cải thiện tốc độ tính toán cho đạt kết tốt 89 TÀI LIỆU THAM KHẢO Tài liệu tiếng việt [1] Trương Văn Hiệu (2011), “Nghiên cứu giải thuật song song hệ thống xử lý đồ họa GPU đa lõi”, luận văn thạc sĩ, trường Đại học Đà Nẵng [2] Nguyễn Việt Đức – Nguyễn Nam Giang (2012), ”Xây dựng thuật toán song song tìm đường ngắn với CUDA”, luận văn thạc sỹ, trường Đại học Công nghệ Hồ Chí Minh [3] Nguyễn Thị Thùy Linh (2009), “Tính toán hiệu cao với xử lý đồ họa GPU ứng dụng”, luận văn thạc sĩ, trường Đại học Công nghệ Hà Nội [4] Nguyễn Thị Dung (2013), “Hệ mã hóa AES”, tiểu luận, trường đại học công nghệ , Đại học Quốc gia Hà Nội [5] Lưu Thị Thúy Linh (2013), “Nghiên cứu vài khía cạnh độ an toàn AES”, luận văn thạc sĩ, Học viện Công nghệ bưu viễn thông Tài liệu tiếng anh [6] Jason Sanders, Edward Kandrot, “CUDA by example”, an introduction to General- Purpose GPU programming [7] Maciej Matyka, “GPGPU programming on example of CUDA”, Institute of Theoretical Physics University of Wroclaw [8] NVIDIA, “High performance computing with CUDA”, Users Group Conference San Diego, CA June 15, 2009 ... tài: NGHIÊN CỨU CÔNG NGHỆ XỬ LÝ GPU VÀ ỨNG DỤNG Luận văn gồm chương chính: Chương 1: Khái quát xử lý đồ họa GPU xử lý song song, Chương giới thiệu tổng quan xử lý song song xử lý đồ họa GPU Chương... nhiều xử lý  Làm rõ xử lý song song xử lý Xử lý thời điểm xử lý phép toán xử lý song song thời điểm thực nhiều phép toán lúc nhiều xử lý, làm cho khả xử lý tăng lên đáng kể so với xử lý Bảng... gen… Xử lý song song chứng minh khả xử lý khả phát triển sau Các khái niệm xử lý songsong  Định nghĩa xử lý songsong Xử lý song song trình xử lý thực nhiều tiến trình lúc để xử lý toán, nhiều xử

Ngày đăng: 13/10/2017, 15:47

Từ khóa liên quan

Tài liệu cùng người dùng

  • Đang cập nhật ...

Tài liệu liên quan