题目:给一个二维数组赋值。

分析:主机端代码完成的主要功能:

  1. 启动CUDA,使用多卡时应加上设备号,或使用cudaSetDevice()设置GPU设备。
  2. 为输入数据分配内存空间
  3. 初始化输入数据
  4. 为GPU分配显存,用于存放输入数据
  5. 将内存中的输入数据拷贝到显存。
  6. 为GPU分配显存,用于存放输出数据。
  7. 调用device端的Kernel进行计算,将结果写到显存中的对应区域。
  8. 为CPU分配内存,用于存放GPU传回的输出数据
  9. 将显存中的结果回读到内存。
  10. 使用CPU对传回的数据进行其他的处理。
  11. 释放内存和显存空间。
  12. 退出CUDA

设备端代码要完成的任务:

  1. 从显存读取数据到GPU片内。
  2. 对数据进行处理。
  3. 将处理后的数据写回显存。

实现代码:

#include <stdlib.h>  //系统头文件
#include <stdio.h>
#include <string.h>
#include <math.h> // 核函数,GPU端代码 #ifndef _EXAMPLE_1_KERNEL_H_
#define _EXAMPLE_1_KERNEL_H_
//////#include <stdio.h> //在emu模式下包含这个头文件,以便输出一些中间结果来观察,在GPU实际运行时是不能使用的
////////////////////////////////////////////////////////////////////////////////
//! Simple test kernel for device functionality
//! @param g_idata input data in global memory
//! @param g_odata output data in global memory
////////////////////////////////////////////////////////////////////////////////
__global__ void
testKernel( float* g_idata, float* g_odata)
{
// shared memory
// extern表示大小由host端的Ns参数确定
extern __shared__ float sdata[]; // access thread id
const unsigned int bid = blockIdx.x; //线程所在的block的索引号
const unsigned int tid_in_block = threadIdx.x; //线程在block中的位置
const unsigned int tid_in_grid = blockDim.x * blockIdx.x + threadIdx.x;
//按行划分任务时,线程在整个grid中的位置 // 将数据从global memory读入shared memory
sdata[tid_in_block] = g_idata[tid_in_grid];
//读入数据后进行一次同步,保证计算时所有数据均已到位
__syncthreads(); // 计算
sdata[tid_in_block] *= (float)bid;
// sdata[tid_in_block] *= (float)tid_in_block;
// sdata[tid_in_block] *= (float)tid_in_grid; //进行同步,确保要写入的数据已经被更新
__syncthreads(); // 将shared memory中的数据写到global memory
g_odata[tid_in_grid] = sdata[tid_in_block];
} #endif // #ifndef _EXAMPLE_1_KERNEL_H_ // 函数声明
void runTest( int argc, char** argv); // 主函数
int main( int argc, char** argv)
{
runTest( argc, argv);
} void runTest( int argc, char** argv)
{ unsigned int num_blocks = 4; //定义网格中的线程块数量
unsigned int num_threads = 4;//定义每个线程块中的线程数量 unsigned int mem_size = sizeof(float) * num_threads * num_blocks;//为数据分配的存储器大小,这里我们用每一个线程计算一个单精度浮点数。 // 在host端分配内存,h_表示host端,i表示input,o表示output
//输入数据
float* h_idata = (float*) malloc( mem_size);
//输出数据
float* h_odata = (float*) malloc( mem_size); // 在device端分配显存,d_表示device端
//显存中的输入数据
float* d_idata;
cudaMalloc( (void**) &d_idata, mem_size);
//显存中的输出数据
float* d_odata;
cudaMalloc( (void**) &d_odata, mem_size); // 初始化内存中的值
for( unsigned int i = 0; i < num_threads * num_blocks; i++)
{
h_idata[i] = 1.0f;
}
// 将内存中的输入数据读入显存,这样就完成了主机对设备的数据写入
cudaMemcpy( d_idata, h_idata, mem_size,cudaMemcpyHostToDevice ); // 设置运行参数,即网格的形状和线程块的形状
dim3 grid( num_blocks, 1, 1);
dim3 threads( num_threads, 1, 1); // 运行核函数,调用GPU进行运算
testKernel<<< grid, threads, mem_size >>>( d_idata, d_odata); // 将结果从显存写入内存
cudaMemcpy( h_odata, d_odata, mem_size,cudaMemcpyDeviceToHost ); // 打印结果
for( unsigned int i = 0; i < num_blocks; i++)
{
for( unsigned int j = 0; j < num_threads; j++)
{
printf( "%5.0f", h_odata[ i * num_threads + j]);
}
printf("\n");
} // 释放存储器
free( h_idata);
free( h_odata);
cudaFree(d_idata);
cudaFree(d_odata);
}

  

矩阵赋值实例(matrixAssign)的更多相关文章

  1. Matlab获取文件夹下所有文件名并将数据按矩阵赋值给变量

    一.获取一个文件夹下所有文件名: fileFolder=fullfile('D:\MATLAB\bin\trc'); dirOutput=dir(fullfile(fileFolder,'*.trc' ...

  2. jQuery对html元素的取值与赋值实例详解

    jQuery对html元素的取值与赋值实例详解 转载  2015-12-18   作者:欢欢   我要评论 这篇文章主要介绍了jQuery对html元素的取值与赋值,较为详细的分析了jQuery针对常 ...

  3. StringGrid 实例3: 本例功能: 1、修改 TStringGrid的默认宽与高; 2、添加行; 3、确认当前单元并赋值.

    实例3: 本例功能: 1.修改 TStringGrid的默认宽与高; 2.添加行; 3.确认当前单元并赋值. 实例图形:

  4. 访问Mat矩阵中的元素并为其赋值

    在OpenCV中有三种方式访问矩阵中的数据元素:容易的方式,困难的方式,以及正确的方式.今天主要讲容易方式: 最容易的方式是使用宏CV_MAT_ELEM( matrix, elemtype, row, ...

  5. OpenGL矩阵类(C++)

    概述 创建&初始化 存取器 矩阵运算 变换函数 实例:模型视图矩阵 实例:投影矩阵 概述 OpenGL固定功能管线提供4个不同类型的矩阵(GL_MODELVIEW.GL_PROJECTION. ...

  6. OpenGL矩阵类(C++) 【转】

    http://www.cnblogs.com/hefee/p/3816727.html OpenGL矩阵类(C++) 概述 创建&初始化 存取器 矩阵运算 变换函数 实例:模型视图矩阵 实例: ...

  7. 快速入门:Python简单实例100个(入门完整版)

    Python3 100例 文章目录 Python3 100例 实例001:数字组合 实例002:“个税计算” 实例003:完全平方数 实例004:这天第几天 实例005:三数排序 实例006:斐波那契 ...

  8. Matlab之矩阵

    1.新建矩阵 A = zeros(5,5); 2.矩阵赋值 A(:,j) = [5  5]表示取A矩阵的第j列全部元素 a.矩阵的同行元素之间用空格(或”,”)隔开: b.矩阵的行与行之间用”;”(或 ...

  9. 4-2.矩阵乘法的Strassen算法详解

    题目描述 请编程实现矩阵乘法,并考虑当矩阵规模较大时的优化方法. 思路分析 根据wikipedia上的介绍:两个矩阵的乘法仅当第一个矩阵B的列数和另一个矩阵A的行数相等时才能定义.如A是m×n矩阵和B ...

随机推荐

  1. iOS多线程的初步研究3

    iOS多线程的初步研究(三) 弄清楚NSRunLoop确实需要花时间,这个类的概念和模式似乎是Apple的平台独有(iOS+MacOSX),很难彻底搞懂(iOS没开源,呜呜). 官网的解释是说run ...

  2. HTML5学习+javascript学习:打飞机游戏简介以及Model层

    本着好记性不如烂博客以及分享成功的喜悦和分享失败的苦楚,今天我来分享下一个练手项目:打飞机游戏~从小就自己想做游戏,可是一直没有机会.HTML5给了我们这个平台,这个平台可以有很多以前想都不敢想的东西 ...

  3. 构建一个真实的应用电子商务SportsStore(十一)

    构建一个真实的应用电子商务SportsStore(十一) 我们的项目已经进入了非常好的良性循环,项目中涵盖了多数现在的主流开源框架的使用.就Ninject而言,我们的运用是非常的成功,没有任何一点多余 ...

  4. MySQL 的 phpmyadmin上传大小限制(转)以及 MySQL server has gone away 的解决办法

    phpmyadmin上传大小限制 原帖地址:http://www.hmidc.com/home/news/?13914.html 时间:2011-6-21 11:17:57  作者:红帽之家  来源: ...

  5. 关于ActiveMQ的一点总结

    ActiveMQ入门 作者:一路向北 摘要:本文主要讲述ActiveMQ的基本知识和使用方法,并简单结合spring使用ActiveMQ. 一.ActiveMQ特性和使用总览 企业消息软件从80年代起 ...

  6. linux培训笔记1

    第五章 文件和目录的管理   linux命令的基本格式   #命令 [选项] [参数]   1.linux下的常用命令   (1)ls    查看(列出)目录下的内容      -l    查看文件详 ...

  7. TestNG中的DataProvider返回Iterator<Object[]>的妙用

    TestNG中使用DataProvider有个好处,就是: 1. 在执行用例的时候dataProvider迭代中的每组数据都是作为一个用例执行 2. 在测试数据有规律的情况下,免去了添加testXML ...

  8. sublime vue 语法高亮插件安装

    默认情况下,Vue.js 的单文件组件(*.vue)在 sublime 编辑器中是不被识别的.若要想高亮显示,需要安装插件 Vue Syntax Hightlight.安装步骤如下:   第一,在 s ...

  9. ActiveMQ的简单例子应用

    ActiveMQ是一种消息中间件,它实现了JMS规范,提供点对点和订阅-发布两种模式.下面介绍下ActiveMQ的使用: 一.环境的搭建 首先我们需要下载ActiveMQ的安装包,下载地址http:/ ...

  10. DW,DM,ODS的区别

    数据仓库的重要应用是将不同来源的数据和异构数据通过ETL整合在一起,为决策分析提供支撑,若在同一个数据库中分不同用户,此意义不大:假设所有有用户都在一个数据库里,如果因为某个原因数据库重启,那么会影响 ...