Многопроцессорные системы (продолжение). Графические ускорители. Использование графических ускорителей для прикладных вычислений (GPGPU). Физическая организация GPU. Архитектура CUDA ( Compute Unified Device Architecture ). Интерфейс программирования CUDA C. Установка среды разработки и исполнения. CUDA_C_Programming_Guide.pdf Боресков А.В., Харламов А.А. Основы работы с технологией CUDA, Москва: ДМК, 2010
Физическое представление GPU
Логическое представление GPU (архитектура CUDA)
#include float serial(float* f, long N); __global__ void summator(float* f,float* s, long N); float parallel(float* f,long N, int num_of_blocks, int threads_per_block); int main(int argc, char* argv[]){ long N; int i; float* fun; int num_of_blocks, threads_per_block; if(argc \n"); return -1; }
N=atoi(argv[1]); num_of_blocks=atoi(argv[2]); threads_per_block=atoi(argv[3]); fun=(float*)malloc(N*sizeof(float)); for(i=0;i
float serial(float* f, long N){ int i; double s=0.0; for(i=0;i
float parallel(float* f,long N, int num_of_blocks, int threads_per_block){ float* f_dev; float* s_dev; float* s_host; float s=0.0; int i; cudaMalloc((void **) &f_dev, N*sizeof(float) ); cudaMemcpy(f_dev, f, N*sizeof(float), cudaMemcpyHostToDevice);
s_host=(float*)malloc( num_of_blocks*threads_per_block*sizeof(float)) cudaMalloc((void **) &s_dev, num_of_blocks*threads_per_block*sizeof(float)); for(i=0;i
summator >>(f _dev, s_dev,N); cudaThreadSynchronize(); cudaMemcpy(s_host, s_dev, num_of_blocks*threads_per_block*sizeof(float), cudaMemcpyDeviceToHost); for(i=0;i
__global__ void summator(float* f,float* s, long N){ int tId = blockIdx.x*blockDim.x+threadIdx.x; int num_of_threads=blockDim.x*gridDim.x; int portion=N/num_of_threads; int i; for(i=tId*portion;i nvcc test1.cu -o test1 > test Serial calculation is over! Result= Parallel calculation is over! Result=