[翻譯]CURAND Libaray--Host API--(2)

Translated by xingoo算法

若是有錯誤請聯繫:xinghl90@gmail.com數組

 

 

2.3 返回值dom

全部的CURAND host端的函數返回值都是curandStatus_t.若是調用沒有錯誤,則返回成功,即返回值爲CURAND_STATUS_SUCCESS.若是發生了錯誤,返回值會依據錯誤的不一樣而不一樣。由於cuda容許內核函數異步的調用cpu端的代碼,所以返回的錯誤,有多是在調用函數庫時發生的,而非CURAND內核函數,此時,返回值是CURAND_STATUS_PREEXISTING.異步

 

2.4 觸發函數函數

curandStatus_t curandGenerate(curandGenerator_t generator, unsigned int *outputPtr, size_t num)

curandGenerate() 函數用來生成僞隨機或者真隨機數序列。包括 XORWOWMRG32k3a,MTGP32,and SOBOL32,每一個元素都是32unsigned int型的每位都是隨機產生的。對於SOBOL64觸發器來講,產生的是每一位隨機產生的64位的unsigned long long型隨機數。性能

curandStatus_t curandGenerateUniform(curandGenerator_t generator,  float *outputPtr, size_t num)

curandGenerateUniform() 函數用來產生0.0-1.0間的服從均勻分佈(uniformly distributed)的浮點型隨機數,其中0不包含0.0,包含1.0spa

curandStatus_t curandGenerateNormal(curandGenerator_t generator, float *outputPtr, size_t n, float mean, float stddev)

curandGenerateNormal()函數經過指定的方法和輸出目標來產生服從正態分佈(normally distributed)的浮點型隨機數。線程

curandStatus_t curandGenerateLogNormal(curandGenerator_t generator, float *outputPtr, size_t n, float mean, float stddev)

curandGenerateLogNormal()函數經過指定的方法和輸出目標產生服從對數正態分佈(log-normaly distributed)的浮點數。code

curandStatus_t curandGeneratePoisson(curandGenerator_t generator, unsigned int *outputPtr, size_t n, double lambda)

curandGeneratePoision()函數經過指定的lamda產生基於泊松分佈(possion distributed)的隨機數。orm

curandStatus_tcurandGenerateUniformDouble(curandGenerator_t generator, double *outputPtr, size_t num)

curandGenerateUniformDouble()函數產生雙精度的均勻分佈的隨機數。

curandStatus_tcurandGenerateNormalDouble(curandGenerator_t generator, double *outputPtr, size_t n, double mean, double stddev)

curandGenerateNormalDouble()觸發器經過指定的方法和標準輸出對象產生基於正態分佈的雙精度隨機數。雙精度的隨機數只能在計算能力在1.3以上或者host端產生。

curandStatus_t curandGenerateLogNormalDouble(curandGenerator_t generator,double *outputPtr, size_t n, double mean, double stddev)

curandGernerateLogNormalDouble()經過指定的方法和輸出對象產生基於正態分佈的對數正態分佈雙精度隨機數。

 

只有多維度的觸發器才能產生真隨機數。(大概是這個意思,For quasirandom generation,the number of results returned must be a multiple of the dimension of the generator

 

生成函數可以被同一個觸發器屢次調用,來產生連續的結果塊。對於僞隨機數觸發器,屢次調用size大小的隨機數,至關於一次調用產生n*size大小的隨機數。對於真隨機數觸發器,因爲內存的空間排序問題,屢次短的調用,與一次長調用產生的結果並不相同;然而,產生的n維動態數組確實相同的。

 

雙精度的隨機數只能在計算能力1.3以上的設備或是host端產生。

 

2.5 Host API Example

/* * This program uses the host CURAND API to generate 100 * pseudorandom floats. */ #include <stdio.h> #include <stdlib.h> #include <cuda.h> #include <curand.h>

 

#define CUDA_CALL(x) do { if((x)!=cudaSuccess) { \ printf("Error at %s:%d\n",__FILE__,__LINE__);\ return EXIT_FAILURE;}} while(0) #define CURAND_CALL(x) do { if((x)!=CURAND_STATUS_SUCCESS) { \ printf("Error at %s:%d\n",__FILE__,__LINE__);\ return EXIT_FAILURE;}} while(0) int main(int argc, char *argv[]) { size_t n = 100; size_t i; curandGenerator_t gen; float *devData, *hostData; /* Allocate n floats on host */ hostData = (float *)calloc(n, sizeof(float)); /* Allocate n floats on device */ CUDA_CALL(cudaMalloc((void **)&devData, n*sizeof(float))); /* Create pseudo-random number generator */ CURAND_CALL(curandCreateGenerator(&gen, CURAND_RNG_PSEUDO_DEFAULT)); /* Set seed */ CURAND_CALL(curandSetPseudoRandomGeneratorSeed(gen, 1234ULL)); /* Generate n floats on device */ CURAND_CALL(curandGenerateUniform(gen, devData, n)); /* Copy device memory to host */ CUDA_CALL(cudaMemcpy(hostData, devData, n * sizeof(float), cudaMemcpyDeviceToHost)); /* Show result */

    for(i = 0; i < n; i++) { printf("%1.4f ", hostData[i]); } printf("\n"); /* Cleanup */ CURAND_CALL(curandDestroyGenerator(gen)); CUDA_CALL(cudaFree(devData)); free(hostData); return EXIT_SUCCESS; }

 

一般經過CURAND庫產生的隨機數規模越大,產生的性能越好。對於屢次調用產生小規模的隨機數來講,儘量少的調用隨機函數庫而產生大量的隨機數來使用,更有效率。好比一次產生n*size大小規模的隨機數,而後分n次使用,要比n次調用,每次產生size高效。XORWOW是默認的僞隨機數觸發器,經過默認的排序,首次調用可能要花費一些時間來啓動,後來的調用就不須要這步了。爲了不啓動時間,可使用CURAND_ORDERING_PSEUDO_SEEDED排序。

 

MTGP32 mersenne Twister算法與線程和塊數目緊密聯繫。MTGP32的產生結果一般是一個經過特定的參數集產生的指定順序的256個大小的樣例,每64個塊使用不一樣的參數集而且每256個線程產生總體中的一個樣例。所以使用MTGP32產生16384個樣品是最高效的。(這一塊有待研究)。

相關文章
相關標籤/搜索