第一个CUDA程序
来源:互联网 发布:2016交通事故数据统计 编辑:程序博客网 时间:2024/05/21 18:48
趁现在,好好学习CUDA!!
#include "cuda_runtime.h"#include "device_launch_parameters.h"#include <stdio.h>#include<iostream>using namespace std;cudaError_t addWithCuda(int *c, const int *a, const int *b, unsigned int size);__global__ void addKernel(int *c, const int *a, const int *b){ int i = threadIdx.x; c[i] = a[i] + b[i];}int main(){int dev_count;cudaGetDeviceCount(&dev_count);cout<<" CUDA 设备数量: " << dev_count << endl;cudaDeviceProp deviceProp;for (int i = 0; i < dev_count; i++){cudaGetDeviceProperties(&deviceProp, i);}printf(" Maximum number of threads per multiprocessor: %d\n", deviceProp.maxThreadsPerMultiProcessor);printf(" Maximum number of threads per block: %d\n", deviceProp.maxThreadsPerBlock);printf(" Max Thread per Block: <%d,%d,%d> \n",deviceProp.maxThreadsDim[0],deviceProp.maxThreadsDim[1], deviceProp.maxThreadsDim[2]);printf(" Max Block per Grid: <%d,%d,%d> \n",deviceProp.maxGridSize[0],deviceProp.maxGridSize[1], deviceProp.maxGridSize[2]);printf(" WarpSize: %d \n",deviceProp.warpSize); const int arraySize = 5; const int a[arraySize] = { 1, 2, 3, 4, 5 }; const int b[arraySize] = { 10, 20, 30, 40, 50 }; int c[arraySize] = { 0 }; // Add vectors in parallel. cudaError_t cudaStatus = addWithCuda(c, a, b, arraySize); if (cudaStatus != cudaSuccess) { fprintf(stderr, "addWithCuda failed!"); return 1; } printf("{1,2,3,4,5} + {10,20,30,40,50} = {%d,%d,%d,%d,%d}\n", c[0], c[1], c[2], c[3], c[4]); // cudaDeviceReset must be called before exiting in order for profiling and // tracing tools such as Nsight and Visual Profiler to show complete traces. cudaStatus = cudaDeviceReset(); if (cudaStatus != cudaSuccess) { fprintf(stderr, "cudaDeviceReset failed!"); return 1; } return 0;}// Helper function for using CUDA to add vectors in parallel.cudaError_t addWithCuda(int *c, const int *a, const int *b, unsigned int size){ int *dev_a = 0; int *dev_b = 0; int *dev_c = 0; cudaError_t cudaStatus; // Choose which GPU to run on, change this on a multi-GPU system. cudaStatus = cudaSetDevice(0); if (cudaStatus != cudaSuccess) { fprintf(stderr, "cudaSetDevice failed! Do you have a CUDA-capable GPU installed?"); goto Error; } // Allocate GPU buffers for three vectors (two input, one output) . cudaStatus = cudaMalloc((void**)&dev_c, size * sizeof(int)); if (cudaStatus != cudaSuccess) { fprintf(stderr, "cudaMalloc failed!"); goto Error; } cudaStatus = cudaMalloc((void**)&dev_a, size * sizeof(int)); if (cudaStatus != cudaSuccess) { fprintf(stderr, "cudaMalloc failed!"); goto Error; } cudaStatus = cudaMalloc((void**)&dev_b, size * sizeof(int)); if (cudaStatus != cudaSuccess) { fprintf(stderr, "cudaMalloc failed!"); goto Error; } // Copy input vectors from host memory to GPU buffers. cudaStatus = cudaMemcpy(dev_a, a, size * sizeof(int), cudaMemcpyHostToDevice); if (cudaStatus != cudaSuccess) { fprintf(stderr, "cudaMemcpy failed!"); goto Error; } cudaStatus = cudaMemcpy(dev_b, b, size * sizeof(int), cudaMemcpyHostToDevice); if (cudaStatus != cudaSuccess) { fprintf(stderr, "cudaMemcpy failed!"); goto Error; } // Launch a kernel on the GPU with one thread for each element. addKernel<<<1, size>>>(dev_c, dev_a, dev_b); // Check for any errors launching the kernel cudaStatus = cudaGetLastError(); if (cudaStatus != cudaSuccess) { fprintf(stderr, "addKernel launch failed: %s\n", cudaGetErrorString(cudaStatus)); goto Error; } // cudaDeviceSynchronize waits for the kernel to finish, and returns // any errors encountered during the launch. cudaStatus = cudaDeviceSynchronize(); if (cudaStatus != cudaSuccess) { fprintf(stderr, "cudaDeviceSynchronize returned error code %d after launching addKernel!\n", cudaStatus); goto Error; } // Copy output vector from GPU buffer to host memory. cudaStatus = cudaMemcpy(c, dev_c, size * sizeof(int), cudaMemcpyDeviceToHost); if (cudaStatus != cudaSuccess) { fprintf(stderr, "cudaMemcpy failed!"); goto Error; }Error: cudaFree(dev_c); cudaFree(dev_a); cudaFree(dev_b); return cudaStatus;}
0 0
- 第一个cuda程序
- cuda第一个程序
- 第一个CUDA程序
- 第一个CUDA程序
- 【CUDA】第一个CUDA程序-addVector
- cuda编程---第一个cuda程序
- 第一个CUDA程序-addVector
- 详解第一个CUDA程序kernel.cu
- VS2013 CUDA8.0 第一个CUDA程序
- 深入浅出谈CUDA-[第三章][第一个CUDA程序]
- 深入浅出谈CUDA-[第四章][改良第一个CUDA程序]
- CUDA下的GPU编程入门--第一个CUDA程序
- CUDA编程(一)第一个CUDA程序
- CUDA小记(2)运行第一个CUDA程序
- CUDA编程(一)第一个CUDA程序
- CUDA学习笔记(2) 第一个CUDA程序
- CUDA第一个程序优化(若干个线程)
- CUDA入门(二)cuda编程的基本知识与第一个cuda程序
- epoll示例程序——服务端
- MapReduce初级经典案例实现
- NYOJ-寻找最大数
- javascript瀑布流
- 4G(LTE)背后的技术和利益纠结——VoIP,VoLTE,SIP,IMS的前世今生
- 第一个CUDA程序
- Android-节日短信送祝福(UI篇:2-展示节日列表的Framgment的创建)
- android 应用实现微信好友或朋友圈分享
- MySQL错误中无法连接 MySQL server (10060)
- Android studio插件GsonFormat,返回json快速创建实体对象
- JAVA Spring面试题
- linux命令笔记
- 矩阵和向量
- 使用Selenium通过浏览器对网站进行自动化测试