使用CUDA实现两个数组的相加,熟悉CUDA相关函数的使用。
#include <cuda_runtime.h> #include <stdio.h> __global__ void addKernel( int* c, const int* a, const int* b ) { int i = threadIdx.x; c[i]= a[i] + b[i]; } cudaError_t CUDA_Add( const int* a, const int* b, int* out, int size ) { int *dev_a; int *dev_b; int *dev_c; //1、设置设备 cudaError_t cudaStatus = cudaSetDevice( 0 ); switch( true ) { default: if( cudaStatus != cudaSuccess ) { fprintf(stderr, "调用cudaSetDevice()函数失败!" ); return cudaStatus; } //2、分配显存空间 cudaStatus= cudaMalloc( (void**)&dev_a, size * sizeof(int) ); if( cudaStatus != cudaSuccess ) { fprintf(stderr, "调用cudaMalloc()函数初始化显卡中a数组时失败!" ); break; } cudaStatus= cudaMalloc( (void**)&dev_b, size * sizeof(int) ); if( cudaStatus != cudaSuccess ) { fprintf(stderr, "调用cudaMalloc()函数初始化显卡中b数组时失败!" ); break; } cudaStatus= cudaMalloc( (void**)&dev_c, size * sizeof(int) ); if( cudaStatus != cudaSuccess ) { fprintf(stderr, "调用cudaMalloc()函数初始化显卡中c数组时失败!" ); break; } //3、将宿主程序数据复制到显存中 cudaStatus= cudaMemcpy( dev_a, a, size * sizeof( int ), cudaMemcpyHostToDevice ); if( cudaStatus != cudaSuccess ) { fprintf( stderr, "调用cudaMemcpy()函数初始化宿主程序数据a数组到显卡时失败!"); break; } cudaStatus= cudaMemcpy( dev_b, b, size * sizeof( int ), cudaMemcpyHostToDevice ); if( cudaStatus != cudaSuccess ) { fprintf(stderr, "调用cudaMemcpy()函数初始化宿主程序数据b数组到显卡时失败!" ); break; } //4、执行程序,宿主程序等待显卡执行完毕 addKernel<<<1,size>>>( dev_c, dev_a, dev_b ); //5、查询内核初始化的时候是否出错 cudaStatus= cudaGetLastError( ); if( cudaStatus != cudaSuccess ) { fprintf(stderr, "显卡执行程序时失败!" ); break; } //6、与内核同步等待执行完毕 cudaStatus= cudaDeviceSynchronize( ); if( cudaStatus != cudaSuccess ) { fprintf(stderr, "在与内核同步的过程中发生问题!" ); break; } //7、获取数据 cudaStatus= cudaMemcpy( out, dev_c, size * sizeof( int ), cudaMemcpyDeviceToHost ); if( cudaStatus != cudaSuccess ) { fprintf(stderr, "在将结果数据从显卡复制到宿主程序中失败!" ); break; } } cudaFree(dev_c ); cudaFree(dev_a ); cudaFree(dev_b ); return cudaStatus; } int main( int argc, char** argv ) { 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 }; int i; cudaDeviceProp prop; //获取cuda数目 int count; cudaGetDeviceCount(&count); printf("CUDA数==%d\n",count); for(i=0;i<count;i++){ //获取设备的属性 cudaGetDeviceProperties(&prop,i); printf("compute capability: %d.%d\n",prop.major,prop.minor); printf("Shared mem per mp: %ld\n",prop.sharedMemPerBlock); } cudaError_t cudaStatus; cudaStatus= CUDA_Add( a, b, c, arraySize ); printf("运算结果是:\nc数组[%d, %d, %d, %d, %d]\n", c[0],c[1], c[2], c[3], c[4] ); cudaStatus= cudaDeviceReset( ); if( cudaStatus != cudaSuccess ) { fprintf(stderr, "调用cudaDeviceReset()函数失败!" ); return 1; } return 0; }
编译运行指令:
# nvcc first_cuda.cu -o first_cuda
# ./first_cuda
运行结果:
CUDA数==1
compute capability: 3.5
Shared mem per mp: 49152
运算结果是:
c数组[11, 22, 33, 44, 55]
相关推荐
demo1.zip 使用cuda平台练习数组的代码,配合文章使用
细节参考:http://blog.csdn.net/qq_17239003/article/details/78824004#0-qzone-1-33634-d020d2d2a4e8d1a374a433f596ad1440
通过共享内存优化,高效地查找一个序列中的最大值并将该最大值放到序列的第一个元素位置。同时,不同于传统的利用线程和数组序号对应的方式,本算法利用连续的线程进行计算,更有利于算法的并发性
并行计算,使用CUDA计算数组求和,包含实验报告和源代码
cuda、GPU实现向量相加
这两个例子程序都是已经调试好的,大家可以直接编译运行了。配置好VS之后就可以运行了
使用CUDA创建的dll动态链接库,C#调用该动态链接库实现GPU计算,这是一个数组相加的案例,参考地址:https://go.lucoder.com/fwlink/?linkid=13
CUDA矩阵相乘A*B=C代码,任意输入矩阵A的宽度和矩阵B的宽度(A[wB][wA]*B[wA][wB]),cudaMallocPitch开辟显存空间,cudaMemcpy2D数组复制,Kahan's Summation Formula提高浮点计算精度。
cuda并行计算 cuda并行计算与应用研究的文章 希望对大家有帮助
cuda安装教程cuda安装教程cuda安装教程cuda安装教程cuda安装教程cuda安装教程cuda安装教程cuda安装教程cuda安装教程cuda安装教程cuda安装教程cuda安装教程cuda安装教程cuda安装教程cuda安装教程cuda安装教程cuda安装...
将体数据映射为三维纹理,利用CUDA三维数组进行存储与绑定,纹理拾取的浮点返回值利用线性滤波进行平滑。在传输函数的设计中引入中心差分梯度幅值增强对体数据边界面的绘制效果。每条光线的求交及颜色积累采用并行...
该资源主要由Introduction、Utilities、Concepts_and_Techniques、CUDA_Features、CUDA_Libraries等6个模块组成, 用于进行CUDA的使用示例演示。 开发者需提前安装CUDA和Cudnn(需结合电脑显卡情况), 然后使用...
cuda_11.2.0_460.27.04_linux.run cuda_11.2.0_460.27cuda_cuda_11.2.0_460.27.04_linux.run .04_linux.run cuda_11.2.0_460.27.04_linux.run cuda_11.2.0_460.27.04_linux.run cuda_11.2.0_460.27.04_linux.run ...
一个将CUDA代码放到QT平台的简单案例,CUDA为9.2版本,Qt的配置文件中CUDA的信息可以根据自己的系统信息调整。演示了两个大向量相加,可以正常输出。
百度网盘提供,包含以下三种版本的cuda toolkit和对应的cudnn版本,适合windows10系统。 cudnn-10.1-windows10-x64-v7.6.4.38.zip cuda_10.1.243_426.00_win10.exe cudnn-11.0-windows-x64-v8.0.4.30.zip cuda_...
CUDA详细参数(算力+CUDA支持版本)
cuda-11.2.0-460.27.04-linux.run cuda安装包 亲测可用 总共四个 这个是第三个cuda-11.2.0-460.27.04-linux.run cuda安装包 亲测可用 总共四个 这个是第三个cuda-11.2.0-460.27.04-linux.run cuda安装包 亲测可用 ...
里面有四个文件 包括cuda的安装 在windows下的使用 使用经验 cuda博客 学习cuda的入门好资料
CUDA调试工具cuda-gdb,包含一个可以在CUDA中检测和调试内存错误的内存检查特性。该文档描述了这个名为cuda-memcheck的工具与它的功能。 NVIDIA用它强大的cuda-gdb硬件调试器简化了CUDA程序错误的调试。然而,每个...
百度网盘提供,包含以下三种版本的cuda toolkit和对应的cudnn版本,适合windows10系统。 cudnn-10.1-windows10-x64-v7.6.4.38.zip cuda_10.1.243_426.00_win10.exe cudnn-11.0-windows-x64-v8.0.4.30.zip cuda_...