Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/image-processing/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Random 重新播种cuRAND主机API_Random_Cuda - Fatal编程技术网

Random 重新播种cuRAND主机API

Random 重新播种cuRAND主机API,random,cuda,Random,Cuda,是否可以重新为cuRAND host API RNG设定种子 我发现,如果我使用相同的种子创建、分配和生成两个独立的主机API RNG实例,它们会产生与预期完全相同的数字序列 但是,如果我创建一个实例,分配、种子并生成一个数字序列,然后使用相同的种子再次调用curandSetPseudoRandomGeneratorSeed(),则生成新的数字它们是不同的序列。我希望它们再次被重置为相同的序列。重置种子不会重置序列。试用 下面是一个工作示例(源自主机API示例): $cat t85.cu /**

是否可以重新为cuRAND host API RNG设定种子

我发现,如果我使用相同的种子创建、分配和生成两个独立的主机API RNG实例,它们会产生与预期完全相同的数字序列


但是,如果我创建一个实例,分配、种子并生成一个数字序列,然后使用相同的种子再次调用curandSetPseudoRandomGeneratorSeed(),则生成新的数字它们是不同的序列。我希望它们再次被重置为相同的序列。

重置种子不会重置序列。试用

下面是一个工作示例(源自主机API示例):

$cat t85.cu
/**此程序使用主机CURAND API生成100*个伪随机浮点*/
#包括
#包括
#包括
#包括
#定义CUDA_调用(x)do{if((x)!=cudaSuccess){\
printf(“在%s处出现错误:%d\n”,\uuuuu文件\uuuuu,\uuuu行\uuuuu)\
返回EXIT_FAILURE;}}while(0)
#定义CURAND_CALL(x)do{if((x)!=CURAND_STATUS\u SUCCESS){\
printf(“在%s处出现错误:%d\n”,\uuuuu文件\uuuuu,\uuuu行\uuuuu)\
返回EXIT_FAILURE;}}while(0)
int main(int argc,char*argv[]){
尺寸n=10;
尺寸i;
库兰发电机;
浮点*devData,*hostData;/*在主机上分配n个浮点*/
hostData=(float*)calloc(n,sizeof(float));/*在设备上分配n个浮点*/
CUDA_调用(cudamaloc((void**)和devData,n*sizeof(float));/*创建伪随机数生成器*/
CURAND_调用(curandCreateGenerator(&gen,CURAND_RNG_PSEUDO_DEFAULT));/*设置种子*/
CURAND_调用(curandSetPseudoRandomGeneratorSeed(gen,1234ULL));/*在设备上生成n个浮点*/
CURAND_调用(curandGenerateUniform(gen,devData,n));/*将设备内存复制到主机*/
CUDA_调用(cudaMemcpy(hostData,devData,n*sizeof(float),cudaMemcpyDeviceToHost));/*显示结果*/
对于(i=0;i
做得很好。将种子和偏移设置回0。如果你回答我可以接受。
$ cat t85.cu
/* * 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 = 10;
  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");
  CURAND_CALL(curandSetGeneratorOffset(gen, 0)); /* Copy device memory to host */
  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;
}
$ nvcc -arch=sm_61 -o t85 t85.cu -lcurand
$ ./t85
0.1455 0.8202 0.5504 0.2948 0.9147 0.8690 0.3219 0.7829 0.0113 0.2855
0.1455 0.8202 0.5504 0.2948 0.9147 0.8690 0.3219 0.7829 0.0113 0.2855
$