改章節(jié)筆者在廣東游玩的時候突然想到的...明天就有想寫幾篇關(guān)于函數(shù)說明的文章,所以回家到之后就奮筆疾書的寫出來發(fā)布了
????
/*=======================================================================
????
* 第二天了,算打弄完這個去吃劈柴院的灌湯包,海上起霧了,要是不冷了,去趟只聽過沒去過的棧橋
????
* 金剛狼3上映有一段時間了吧,晚上去試試。。
????
=======================================================================*/
????我看過cublas的說明文檔,它在解講的時候先從總體上說明cublas的基本存儲則規(guī),所以這里,我說幾點(diǎn),這些容內(nèi)將在實(shí)際中體具習(xí)練。
????
????
2.1 實(shí)際之前的cublas幾點(diǎn)說明
????
- cublas實(shí)現(xiàn)三個別級的BLAS(Basic Linear Algebra Subprograms)的函數(shù)能功,關(guān)于BLAS的說明,大家可以在 這里 找到。
- 本節(jié)中述講blas1中的某個函數(shù)的應(yīng)用。
- cublas接受的參數(shù),按照存儲點(diǎn)地分,有三種:設(shè)備上,主機(jī)上,設(shè)備或者主機(jī)上。按照數(shù)學(xué)類型分:量標(biāo)(對應(yīng)單變量,常量),量向(對應(yīng)數(shù)組),矩陣(對應(yīng)數(shù)組)。
- cublas中量向,矩陣 從1開始引索 。這點(diǎn)要注意的是,cublas自己的函數(shù)這樣實(shí)現(xiàn),我們自己的數(shù)據(jù)還是按照自己的語言標(biāo)準(zhǔn)來做的,就是說,你用C語言的數(shù)組,還是從0開始,但是用cublas庫的時候,庫本身自己從1開始。
????
????
2.2 境環(huán)外額配置
????上一篇中紹介了如何配置cublas的編譯境環(huán),不過要應(yīng)用cublas,還需要cuda的runtime支撐,所以你需要在鏈接器的依附項(xiàng)中添加cudart.lib的外額依附。體具添加法方,與上一篇中法方相似,不再贅述。
????另外,源碼中應(yīng)用cuda runtime函數(shù)的文件中要添加#include “cuda_runtime.h”
????
????
2.3 驗(yàn)實(shí)函數(shù)說明
????明天我們要驗(yàn)實(shí)的庫函數(shù)是cublasIsamax(...),它要實(shí)現(xiàn)的能功是得獲某個量向中第一個最大模的引索號,注意這個引索號是從1開始的。
????函數(shù)型原是:cublasStatus_t cublasIsamax(cublasHandle_t handle, int n,?const float *x, int incx, int *result)
????參數(shù)說明:
????
- 回返值,含包函數(shù)的誤錯碼代,這是個枚舉類型,值為CUBLAS_STATUS_SUCCESS時,時常正,否則說明發(fā)生了誤錯。
- handle,表現(xiàn)是cublas的上下文句柄。由cublasStatus_t?cublasCreate(cublasHandle_t *handle)函數(shù)創(chuàng)立,由cublasStatus_t?cublasDestroy(cublasHandle_t handle)釋放。
- n,表現(xiàn)量向x中要引索的元素的總個數(shù)。
- x,量向x。他的存儲 必須存儲在GPU上 。
- incx,要引索的x中元素的增量。
- result,寄存結(jié)果。他的存 儲可以在CPU上也可以在GPU上 。
????數(shù)學(xué)上解釋下算法:
????此函數(shù)回返第一個i,使得 |Im(x[j])| + |Re(x[j])| 為最大值,其中i=1,...,n,并且,j=1 + (i-1)*incx.
????
????
2.4 基本驗(yàn)實(shí)
????碼代我貼在了上面
#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;
}
????總結(jié)
????為盡的地方,歡送大家批駁針指。
????
????
????
????
????
????
文章結(jié)束給大家分享下程序員的一些笑話語錄: 這年頭的互聯(lián)網(wǎng)真是娛樂了中國,網(wǎng)民們從各種各樣的“門”里鉆來鉆去,又有好多“哥”好多“帝”,值得大家品味不已……網(wǎng)絡(luò)經(jīng)典語錄,關(guān)于IT與互聯(lián)網(wǎng),經(jīng)典與您分享!
更多文章、技術(shù)交流、商務(wù)合作、聯(lián)系博主
微信掃碼或搜索:z360901061
微信掃一掃加我為好友
QQ號聯(lián)系: 360901061
您的支持是博主寫作最大的動力,如果您喜歡我的文章,感覺我的文章對您有幫助,請用微信掃描下面二維碼支持博主2元、5元、10元、20元等您想捐的金額吧,狠狠點(diǎn)擊下面給點(diǎn)支持吧,站長非常感激您!手機(jī)微信長按不能支付解決辦法:請將微信支付二維碼保存到相冊,切換到微信,然后點(diǎn)擊微信右上角掃一掃功能,選擇支付二維碼完成支付。
【本文對您有幫助就好】元

