• 函数说明玩玩CUBLAS(2)——level1函数


    改章节笔者在广东游玩的时候突然想到的...明天就有想写几篇关于函数说明的文章,所以回家到之后就奋笔疾书的写出来发布了

        

    /*=======================================================================

        

    * 第二天了,算打弄完这个去吃劈柴院的灌汤包,海上起雾了,要是不冷了,去趟只听过没去过的栈桥

        

    * 金刚狼3上映有一段时间了吧,晚上去试试。。

        

    =======================================================================*/

        我看过cublas的说明文档,它在解讲的时候先从总体上说明cublas的基本存储则规,所以这里,我说几点,这些容内将在实际中体具习练。

        

        

    2.1 实际之前的cublas几点说明

        

    • cublas实现三个别级的BLAS(Basic Linear Algebra Subprograms)的函数能功,关于BLAS的说明,大家可以在这里找到。
    • 本节中述讲blas1中的某个函数的应用。
    • cublas接受的参数,按照存储点地分,有三种:设备上,主机上,设备或者主机上。按照数学类型分:量标(对应单变量,常量),量向(对应数组),矩阵(对应数组)。
    • cublas中量向,矩阵从1开始引索。这点要注意的是,cublas自己的函数这样实现,我们自己的数据还是按照自己的语言标准来做的,就是说,你用C语言的数组,还是从0开始,但是用cublas库的时候,库本身自己从1开始。

        

        

    2.2 境环外额配置

        上一篇中绍介了如何配置cublas的编译境环,不过要应用cublas,还需要cuda的runtime支撑,所以你需要在链接器的依附项中添加cudart.lib的外额依附。体具添加法方,与上一篇中法方相似,不再赘述。

        另外,源码中应用cuda runtime函数的文件中要添加#include “cuda_runtime.h”

        

        

    2.3 验实函数说明

        明天我们要验实的库函数是cublasIsamax(...),它要实现的能功是得获某个量向中第一个最大模的引索号,注意这个引索号是从1开始的。

        函数型原是:cublasStatus_t cublasIsamax(cublasHandle_t handle, int n, const float *x, int incx, int *result)

        参数说明:

        

    • 回返值,含包函数的误错码代,这是个枚举类型,值为CUBLAS_STATUS_SUCCESS时,时常正,否则说明发生了误错。
    • handle,表现是cublas的上下文句柄。由cublasStatus_t cublasCreate(cublasHandle_t *handle)函数创立,由cublasStatus_t cublasDestroy(cublasHandle_t handle)释放。
    • n,表现量向x中要引索的元素的总个数。
    • x,量向x。他的存储必须存储在GPU上
    • incx,要引索的x中元素的增量。
    • result,寄存结果。他的存储可以在CPU上也可以在GPU上

        数学上解释下算法:

        此函数回返第一个i,使得 |Im(x[j])| + |Re(x[j])| 为最大值,其中i=1,...,n,并且,j=1 + (i-1)*incx.

        每日一道理
    如果你们是蓝天,我愿做衬托的白云;如果你们是鲜花,我愿做陪伴的小草;如果你们是大树,我愿做点缀的绿叶……我真诚地希望我能成为你生活中一个欢乐的音符,为你的每一分钟带去祝福。

        

        

    2.4 基本验实

        码代我贴在了上面

    #include <stdio.h>
    #include <stdlib.h>
    #include <time.h>
    
    #include "cuda_runtime.h"
    #include "cublas_v2.h"
    #define DATA_SIZE 1024
    
    #define CUBLAS_ERROR_CHECK(sdata) if(CUBLAS_STATUS_SUCCESS!=sdata){printf("ERROR at:%s:%d\n",__FILE__,__LINE__);exit(-1);}
    
    void InitVector(float *vec, int n, int down, int up)
    {
    	int i;
    	srand((unsigned int)time(NULL));
    	for (i = 0; i < n; i++)
    	{
    		vec[i] = (float)(rand()%(up-down+1)+down);
    	}
    	return ;
    }
    void myIsamax(int n, float *x, int incx, int *result)
    {
    	int i = 0;
    	*result = 0;
    	for (i = 1; i < n; i+=incx)
    	{
    		if(x[i]>x[*result]) *result=i; 
    	}
    }
    int main(int argc, char **argv)
    {
    	cublasHandle_t cubhandle;
    	cublasStatus_t cubStatus = CUBLAS_STATUS_SUCCESS;
    
    	float *h_datax;
    	float *d_datax;
    	int    h_result;
    	int    d_result;
    	int    data_size = DATA_SIZE;
    	
    	// initialize cublas resource
    	cubStatus = cublasCreate(&cubhandle); CUBLAS_ERROR_CHECK(cubStatus)
    
    	// allocate memory CPU + GPU
    	h_datax = (float*)malloc(data_size*sizeof(float));
    	cudaMalloc((void**)&d_datax, data_size*sizeof(float));
    
    	// initialize cpu memory
    	InitVector(h_datax, data_size, 0, 100);
    
    	// copy cpu value to gpu memory
    	cubStatus = cublasSetVector(data_size, sizeof(float), h_datax, 1, d_datax, 1);
    	CUBLAS_ERROR_CHECK(cubStatus)
    	
    	// execute GPU version
    	cubStatus = cublasIsamax(cubhandle, data_size, d_datax, 1, &d_result); CUBLAS_ERROR_CHECK(cubStatus)
    	// execute CPU version
    
    	myIsamax(data_size, h_datax, 1, &h_result);
    
    
    	printf("host   : h_datax[%d]=%.2f\n", h_result, h_datax[h_result]);
    	printf("device : d_datax[%d]=%.2f\n", d_result-1, h_datax[d_result-1]);
    
    
    	// Free memory
    	free(h_datax);h_datax=0x0;
    	cudaFree(d_datax);d_datax=0x0;
    
    	cublasDestroy(cubhandle);
    	getchar();
    	return 0;
    }

        总结

        为尽的地方,欢送大家批驳针指。

        

        

        

        

        

        

    文章结束给大家分享下程序员的一些笑话语录: 这年头的互联网真是娱乐了中国,网民们从各种各样的“门”里钻来钻去,又有好多“哥”好多“帝”,值得大家品味不已……网络经典语录,关于IT与互联网,经典与您分享!

  • 相关阅读:
    5.0、Android Studio调试你的应用
    4.4、Android Studio在命令行运行Gradle
    4.3、Android Studio突破64K方法限制
    4.2、Android Studio压缩你的代码和资源
    4.1、Android Stuido配置你的Build Variant
    【java多线程系列】java中的volatile的内存语义
    【java多线程系列】java内存模型与指令重排序
    4.0、Android Studio配置你的构建
    HashMap
    zk常用命令
  • 原文地址:https://www.cnblogs.com/xinyuyuanm/p/3065429.html
Copyright © 2020-2023  润新知