矩阵赋值实例(matrixAssign)

#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);
}

  

时间: 2024-11-10 00:59:27

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

opencv矩阵赋值函数copyTo、clone、重载元算赋=的比较

opencv矩阵赋值函数copyTo.clone.重载元算赋'='之间实现的功能相似均是给不同的矩阵赋值功能.copyTo和clone函数基本相同,被赋值的矩阵和赋值矩阵之间空间独立,不共享同一空间.但是重载元算赋'=',被赋值的矩阵和赋值矩阵之间空间共享,改变任一个矩阵的值,会同时影响到另一个矩阵.当矩阵作为函数的返回值时其功能和重载元算赋'='相同,赋值运算赋会给矩阵空间增加一次计数,所以函数变量返回后函数内部申请的变量空间并不会被撤销,在主函数中仍可以正常使用传递后的参数.具体的过程见下面

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

jQuery对html元素的取值与赋值实例详解 转载  2015-12-18   作者:欢欢   我要评论 这篇文章主要介绍了jQuery对html元素的取值与赋值,较为详细的分析了jQuery针对常见html元素的获取与赋值技巧,非常简单实用,需要的朋友可以参考下 本文实例讲述了jQuery对html元素的取值与赋值方法.分享给大家供大家参考,具体如下: Jquery给基本控件的取值.赋值 TEXTBOX: ? 1 2 3 4 5 var str = $('#txt').val(); $('#

VC和matleb混合编程之mx矩阵赋值(C语言)

将vector容器x,y的数据转换为matlab矩阵mxMatrix的几种赋值方式: 1: memcpy(mxGetPr(mxa_x),&x[0], y.size()*sizeof(double)); memcpy(mxGetPr(mxa_y),&y[0], y.size()*sizeof(double));//OK &x[0]:即是容器元素的首地址 2. memcpy(mxGetPr(mxa_x),&x.at(0), y.size()*sizeof(double)); m

矩阵应用实例及js实现矩阵转置算法

场景: 后端返回的是[['2015-1-1',1,1],['2015-1-2',1,2]]这样的Json数组,代表的意思是2015-1-1这个日期下新增的数据为1,减少的数据为1,2015-1-2这个日期,新增的数据为1,减少的数据为2,但是在统计图表上要在x轴显示时间,y轴显示新增和减少的数据这时,就要把数据转化成[['2015-1-1','2015-1-2'],[1,1],[1,2]]这样的结构,这也可以叫做矩阵的转置. 关于矩阵转置,可以用下图简单说明一下: 图片描述(最多50字) A表示

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

在OpenCV中有三种方式访问矩阵中的数据元素:容易的方式,困难的方式,以及正确的方式.今天主要讲容易方式: 最容易的方式是使用宏CV_MAT_ELEM( matrix, elemtype, row, col ),输入参数是矩阵,不是指针,网上有很多人说是指针,矩阵元素类型,行,列,返回值是相应行,列的矩阵元素.CV_MAT_ELEM可以给矩阵赋值,也可以访问矩阵元素. CV_MAT_ELEM宏实际上会调用CV_MAT_ELEM_PTR(matrix,row,col)宏来完成任务. CV_MAT

矩阵乘法的Strassen算法详解

题目描述 请编程实现矩阵乘法,并考虑当矩阵规模较大时的优化方法. 思路分析 根据wikipedia上的介绍:两个矩阵的乘法仅当第一个矩阵B的列数和另一个矩阵A的行数相等时才能定义.如A是m×n矩阵和B是n×p矩阵,它们的乘积AB是一个m×p矩阵,它的一个元素其中 1 ≤ i ≤ m, 1 ≤ j ≤ p. 值得一提的是,矩阵乘法满足结合律和分配率,但并不满足交换律,如下图所示的这个例子,两个矩阵交换相乘后,结果变了: 下面咱们来具体解决这个矩阵相乘的问题. 解法一.暴力解法 其实,通过前面的分析

Matlab之矩阵

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

拷贝构造函数 Vs 赋值运算函数

1.拷贝构造函数:用已经创建对象初始化新的对象,首先是一个构造函数,在调用时候产生对象,通过参数传递对其进行初始化 2.赋值运算函数:operator():将一个对象赋值给一个原有对象,所以原有的对象中的内存必须进行释放同时判断两个对象是是不是同一个对象 1 /*赋值运算符号*/ 2 #include<iostream> 3 #include<string> 4 using namespace std; 5 6 class CMyString 7 { 8 private: 9 ch

《学习opencv》笔记——矩阵和图像操作——cvDet,cvDit,cvDotProduct,cvEigenVV and cvFlip

矩阵和图像的操作 (1)cvDet函数 其结构 double cvDet(//计算矩阵的行列式 const CvArr* mat ); 实例代码 #include <cv.h> #include <highgui.h> #include <stdio.h> #include <iostream> using namespace std; int main() { double va[] = {1,0,0,0,2,0,0,0,3}; CvMat Va=cvMa