多GPU设备处理点积示例
多GPU设备处理点积示例,项目打包下载
/*
* Copyright 1993-2010 NVIDIA Corporation. All rights reserved.
*
* NVIDIA Corporation and its licensors retain all intellectual property and
* proprietary rights in and to this software and related documentation.
* Any use, reproduction, disclosure, or distribution of this software
* and related documentation without an express license agreement from
* NVIDIA Corporation is strictly prohibited.
*
* Please refer to the applicable NVIDIA end user license agreement (EULA)
* associated with this source code for terms and conditions that govern
* your use of this NVIDIA software.
*
*/ #include "../common/book.h"
#include "cuda.h"
#include "device_launch_parameters.h"
#include "device_functions.h"
#include "cuda_runtime.h" #define imin(a,b) (a<b?a:b) #define N (33*1024*1024)
const int threadsPerBlock = ;
const int blocksPerGrid =
imin(, (N / + threadsPerBlock - ) / threadsPerBlock); __global__ void dot(int size, float *a, float *b, float *c) {
__shared__ float cache[threadsPerBlock];
int tid = threadIdx.x + blockIdx.x * blockDim.x;
int cacheIndex = threadIdx.x; float temp = ;
while (tid < size) {
temp += a[tid] * b[tid];
tid += blockDim.x * gridDim.x;
} // set the cache values
cache[cacheIndex] = temp; // synchronize threads in this block
__syncthreads(); //块内归约
int i = blockDim.x / ;
while (i != ) {
if (cacheIndex < i)
cache[cacheIndex] += cache[cacheIndex + i];
__syncthreads();
i /= ;
} if (cacheIndex == )
c[blockIdx.x] = cache[];
} struct DataStruct {
int deviceID;
int size;
float *a;
float *b;
float returnValue;
}; unsigned WINAPI routine(void *pvoidData)
//void* routine(void *pvoidData)
{
DataStruct *data = (DataStruct*)pvoidData;
HANDLE_ERROR(cudaSetDevice(data->deviceID)); int size = data->size;
float *a, *b, c, *partial_c;
float *dev_a, *dev_b, *dev_partial_c; // allocate memory on the CPU side
a = data->a;
b = data->b;
partial_c = (float*)malloc(blocksPerGrid*sizeof(float)); // allocate the memory on the GPU
HANDLE_ERROR(cudaMalloc((void**)&dev_a,
size*sizeof(float)));
HANDLE_ERROR(cudaMalloc((void**)&dev_b,
size*sizeof(float)));
HANDLE_ERROR(cudaMalloc((void**)&dev_partial_c,
blocksPerGrid*sizeof(float))); // copy the arrays 'a' and 'b' to the GPU
HANDLE_ERROR(cudaMemcpy(dev_a, a, size*sizeof(float),
cudaMemcpyHostToDevice));
HANDLE_ERROR(cudaMemcpy(dev_b, b, size*sizeof(float),
cudaMemcpyHostToDevice)); dot <<<blocksPerGrid, threadsPerBlock >>>(size, dev_a, dev_b,
dev_partial_c);
// copy the array 'c' back from the GPU to the CPU
HANDLE_ERROR(cudaMemcpy(partial_c, dev_partial_c,
blocksPerGrid*sizeof(float),
cudaMemcpyDeviceToHost)); // finish up on the CPU side
c = ;
for (int i = ; i<blocksPerGrid; i++) {
c += partial_c[i];
} HANDLE_ERROR(cudaFree(dev_a));
HANDLE_ERROR(cudaFree(dev_b));
HANDLE_ERROR(cudaFree(dev_partial_c)); // free memory on the CPU side
free(partial_c); data->returnValue = c;
return ;
} int main(void) {
int deviceCount;
HANDLE_ERROR(cudaGetDeviceCount(&deviceCount));
//要求两个设备
if (deviceCount < ) {
printf("We need at least two compute 1.0 or greater "
"devices, but only found %d\n", deviceCount);
return ;
} float *a = (float*)malloc(sizeof(float)* N);
HANDLE_NULL(a);
float *b = (float*)malloc(sizeof(float)* N);
HANDLE_NULL(b); // fill in the host memory with data
for (int i = ; i<N; i++) {
a[i] = i;
b[i] = i * ;
} /*
为多线程做准备
每个DateStruct都为数据集大小的一半
*/
DataStruct data[];
data[].deviceID = ;
data[].size = N / ;
data[].a = a;
data[].b = b; data[].deviceID = ;
data[].size = N / ;
data[].a = a + N / ;
data[].b = b + N / ; CUTThread thread = start_thread(routine, &(data[]));
routine(&(data[]));
end_thread(thread); // free memory on the CPU side
free(a);
free(b); printf("Value calculated: %f\n",
data[].returnValue + data[].returnValue); return ;
}
多GPU设备处理点积示例的更多相关文章
- 利用nvidia-smi 管理和监控NVIDIA GPU设备
NVIDIA系统管理界面介绍 原文来源:https://developer.nvidia.com/nvidia-system-management-interface NVIDIA系统管理界面(nvi ...
- 【VS开发】设备控制台 (DevCon.exe) 示例
设备控制台 (DevCon.exe) 示例 本部分提供以下设备控制台 (DevCon.exe) 命令的示例: DevCon HwIDs 示例 1:查找所有硬件 ID 示例 2:使用模式查找硬件 ID ...
- [转载]tensorflow中使用tf.ConfigProto()配置Session运行参数&&GPU设备指定
tf.ConfigProto()函数用在创建session的时候,用来对session进行参数配置: config = tf.ConfigProto(allow_soft_placement=True ...
- tensorflow中使用tf.ConfigProto()配置Session运行参数&&GPU设备指定
tf.ConfigProto()函数用在创建session的时候,用来对session进行参数配置: config = tf.ConfigProto(allow_soft_placement=True ...
- 使用tf.ConfigProto()配置Session运行参数和GPU设备指定
参考链接:https://blog.csdn.net/dcrmg/article/details/79091941 tf.ConfigProto()函数用在创建session的时候,用来对sessio ...
- tf.Session()函数的参数应用(tensorflow中使用tf.ConfigProto()配置Session运行参数&&GPU设备指定)
版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明.本文链接:https://blog.csdn.net/dcrmg/article/details ...
- OpenStack 企业私有云的若干需求(1):Nova 虚机支持 GPU
本系列会介绍OpenStack 企业私有云的几个需求: 自动扩展(Auto-scaling)支持 多租户和租户隔离 (multi-tenancy and tenancy isolation) 混合云( ...
- 《CUDA并行程序设计:GPU编程指南》
<CUDA并行程序设计:GPU编程指南> 基本信息 原书名:CUDA Programming:A Developer’s Guide to Parallel Computing with ...
- GPU编程自学3 —— CUDA程序初探
深度学习的兴起,使得多线程以及GPU编程逐渐成为算法工程师无法规避的问题.这里主要记录自己的GPU自学历程. 目录 <GPU编程自学1 -- 引言> <GPU编程自学2 -- CUD ...
随机推荐
- Redis数据类型,持久化,回收策略——(Redis缓存第一章)
缓存:第一种是内存缓存 比如Map(简单的数据结构),以及EH Cache(Java第三方库),第二种是缓存组件比如Memached,Redis:Redis(remote dictionary ser ...
- File类、递归
File类.递归 1.1File类概述 java.io.File表示文件和目录路径名的抽象类.可以对文件和文件夹进行创建删除.获取.判断.遍历等功能. 1.2路径\文件分割符,相对路径绝度路径 1.2 ...
- Scanner类、Random类、ArrayList类
先写个框架,复习内容后来添加... 先写个框架,复习内容后来添加... 先写个框架,复习内容后来添加... 先写个框架,复习内容后来添加... 先写个框架,复习内容后来添加... 先写个框架,复习内容 ...
- thinkphp5.1跨模块调用控制器或者模型
tp5.1 采用命名空间的方式进行调用.
- winform-Chrome-CefSharp库
相关资源 教程地址:Winform下CefSharp的引用.配置.实例与报错排除 支持html5:http://www.html5tricks.com/demo/html5-css3-windmill ...
- SpringBoot | 第二十三章:日志管理之整合篇
前言 在本系列<第四章:日志管理>中,由于工作中日志这块都是走默认配置,也没有深入了解过,因为部署过程中直接使用了linux中的输出重定向功能,如java -jar xx.jar > ...
- GitLab常用命令整理
进入本地仓库访问位置之后执行命令 1) 远程仓库相关命令 检出仓库:$ git clone git://github.com/jquery/jquery.git 查看远程仓库:$ git remote ...
- Flask之目录结构
学习Flask,整合其目录结构也是比较重要的.一个最基础的Flask目录如下所示: 一.SQLAlchemy-utils 由于sqlalchemy中没有提供choice方法,所以借助SQLAlchem ...
- react的setState使用中遇到的问题
setState()更新的数据和自己预期的不一致 对 React 新手来说,使用 setState 是一件很复杂的事情.即使是熟练的 React 开发,也很有可能因为 React 的一些机制而产生一些 ...
- CPU保护模式DPL、CPL简易理解
现代INTEL CPU都有保护模式,实模式这两种CPU运行模式.当CPU加电,CPU初始化时就运行在是模式下,然后现代操作系统会从实模式跳转到保护模式! 为什么需要保护模式? 在最开始编程的汇编时代, ...