2012-08-06 65 views
7

Tôi muốn tạo các số ngẫu nhiên trong hàm __device__ và giữ nó trong Bảng int của mình [500], tôi đã tìm thấy một số ví dụ, nhưng chúng đã sử dụng một số loại có tên là curandState. Tôi chỉ cần một hàm như rand() trong C++.Tạo số ngẫu nhiên CUDA

+0

Hạt nhân thiết lập của bạn không bao giờ chạy vì bạn đang cố gắng khởi động nó với khối chứa 40000 chủ đề. – talonmies

+0

Tại sao bạn xóa mã của mình? – talonmies

Trả lời

5

đây là mã của tôi, tôi có N3 [40000] mảng trong bộ nhớ điện thoại của mình, tôi tạo ra một số số ngẫu nhiên trong hạt nhân của tôi làm việc cho một chuỗi (tôi có nghĩa là "hạt nhân < < < 1,1 >>> .. . "), sau đó tôi sao chép nó vào N2 [40000] của tôi từ CPU, và in nó, do đó, đây là mã số

#include <iostream> 
#include <Cuda.h> 
#include<curand.h> 
#include<curand_kernel.h> 


int n = 200; 
using namespace std; 

__device__ float generate(curandState* globalState, int ind) 
{ 
    //int ind = threadIdx.x; 
    curandState localState = globalState[ind]; 
    float RANDOM = curand_uniform(&localState); 
    globalState[ind] = localState; 
    return RANDOM; 
} 

__global__ void setup_kernel (curandState * state, unsigned long seed) 
{ 
    int id = threadIdx.x; 
    curand_init (seed, id, 0, &state[id]); 
} 

__global__ void kernel(float* N, curandState* globalState, int n) 
{ 
    // generate random numbers 
    for(int i=0;i<40000;i++) 
    { 
     int k = generate(globalState, i) * 100000; 
     while(k > n*n-1) 
     { 
      k-=(n*n-1); 
     } 
     N[i] = k; 
    } 
} 

int main() 
{ 
    int N=40000; 

    curandState* devStates; 
    cudaMalloc (&devStates, N*sizeof(curandState)); 

    // setup seeds 
    setup_kernel <<< 1, N >>> (devStates,unsigned(time(NULL))); 

    float N2[40000]; 
    float* N3; 
    cudaMalloc((void**) &N3, sizeof(float)*N); 

    kernel<<<1,1>>> (N3, devStates, n); 

    cudaMemcpy(N2, N3, sizeof(float)*N, cudaMemcpyDeviceToHost); 

    for(int i=0;i<N;i++) 
    { 
     cout<<N2[i]<<endl; 
    } 

    return 0; 
} 
+0

Có 'setup_kernel <<< 1, N > >> (devStates, unsigned (time (NULL)));' work? Tôi tin rằng có 40000 chủ đề trong một khối là không thể ... – Curious

3

Bạn có thể sử dụng thư viện curand để tạo số ngẫu nhiên trong bộ nhớ thiết bị và sau đó chạy hạt nhân mà không cần phải sao chép các giá trị đó vào máy chủ.

+0

cảm ơn, nhưng tôi không biết chức năng gì và cách sử dụng cho số ngẫu nhiên từ lề đường, và Bảng của tôi [500] trong bộ nhớ điện thoại của tôi. bạn có thể viết mã cho Ban của tôi không? Tôi sẽ rất biết ơn –

+1

Tôi tin rằng đây là kịch bản cơ bản nhất (mặc dù bạn cũng sẽ phải nhân giống thế hệ - nếu không bạn sẽ nhận được cùng một chuỗi mỗi lần): cudaMalloc (& randoms_dev, sizeof (float) * WORK_SIZE); curandCreateGenerator (& generator, CURAND_RNG_PSEUDO_DEFAULT); curandGenerateUniform (máy phát điện, randoms_dev, WORK_SIZE); curandDestroyGenerator (máy phát điện); – Eugene

+0

cảm ơn bạn rất nhiều –