2013-06-23 47 views
1

我想在設備上生成統一的隨機數,用於設備函數內部。每個線程應該生成一個不同的統一的隨機數。我有這個代碼,但我得到了分段錯誤。在CUDA設備上生成均勻的雙隨機數

int main{ 
    curandStateMtgp32 *devMTGPStates; 
    mtgp32_kernel_params *devKernelParams; 

    cudaMalloc((void **)&devMTGPStates, NUM_THREADS*NUM_BLOCKS * sizeof(curandStateMtgp32)); 
    cudaMalloc((void**)&devKernelParams,sizeof(mtgp32_kernel_params)); 

    curandMakeMTGP32Constants(mtgp32dc_params_fast_11213, devKernelParams); 
    curandMakeMTGP32KernelState(devMTGPStates, 
    mtgp32dc_params_fast_11213, devKernelParams,NUM_BLOCKS*NUM_THREADS, 1234); 

    doHenry <<NUM_BLOCKS,NUM_THREADS>>> (devMTGPStates); 
} 

和,我的整體功能doHenry,設備上的評價裏面,我把:

double rand1 = curand_uniform_double(&state[threadIdx.x+NUM_THREADS*blockIdx.x]); 

這是生成每個線程隨機數的最佳方式?我不明白devKernelParams在做什麼,但是我知道每個線程都需要一個狀態,對吧?

謝謝你的幫助。

+1

如果您發現這樣的問題,如果您爲您的讀者確定哪條線路會給您發生故障,這很方便。如果你不知道 - 請做那種微不足道的調試。此外,你應該[檢查你的cuda API調用](http://stackoverflow.com/questions/14038589/what-is-the-canonical-way-to-check-for-errors-using-the-cuda-runtime -api)和curand調用,並進行錯誤檢查。 Curand錯誤檢查包含在[documentation](http://docs.nvidia.com/cuda/curand/index.html#topic_1_2_3)中。是的,如果你想要每個線程獨立的隨機序列,你需要每個線程一個狀態。 –

回答

2

我覺得你要在這條線的賽格故障:

curandMakeMTGP32KernelState(devMTGPStates, mtgp32dc_params_fast_11213, devKernelParams,NUM_BLOCKS*NUM_THREADS, 1234); 

相信對於賽格故障的原因是因爲你已經超過了200的n參數,要爲其傳遞NUM_BLOCKS*NUM_THREADS。我嘗試了一個你的代碼版本,並且我能夠在n = 540左右重現seg故障。

當使用預先生成的內核參數(mtgp32dc_params_fast_11213)時,MT發生器對它可以設置的狀態量有限制。您不妨閱讀documentation的相關章節。 (使用MTGP32發生器生成位)

我不是CURAND的專家,但其他生成器(如XORWOW)沒有這種類型的限制,所以如果您想要生成大量的獨立線程狀態很容易,請考慮其他發生器之一。使用您所概述的特定方法,MTGP32生成器似乎被限制在約200 * 256個獨立線程生成。與我在評論中所說的相反(對於其他生成器類型,這是正確的),對於多達256個線程的塊,MTGP32狀態在一種狀態下似乎是足夠的。 documentation(參考第二個示例)中給出的示例使用該類型的狀態生成和線程塊分層結構。

+0

謝謝。我在想我每個線程需要一個狀態;但是看起來,每個塊的一個狀態就足以在每個線程上生成一個不同的統一數字,而與所有其他塊無關,從您向我展示的示例中。 – Cokes