Pouvez-vous élaborer sur ce qui se passe réellement quand il se bloque? Vérifiez-vous toutes les valeurs d'erreur?
Votre boucle devrait ressembler au code ci-dessous. Est-il possible que cudaMalloc échoue à votre insu et vous passez donc un pointeur invalide, ou quelque chose de similaire?
curandGenerator_t gen;
curandResult = curandCreateGenerator(&gen, CURAND_RNG_PSEUDO_DEFAULT));
if (curandResult != CURAND_STATUS_SUCCESS)
{
// throw or whatever
}
curandResult = curandSetPseudoRandomGeneratorSeed(gen, 1234ULL));
if (curandResult != CURAND_STATUS_SUCCESS)
{
// throw or whatever
}
cudaResult = cudaMalloc((void **)&data, szend * sizeof(float));
if (cudaResult != cudaSuccess)
{
// throw or whatever
}
for (unsigned int sz = szstart ; sz <= szend ; sz += szstep)
{
float *data = 0;
/* Could allocate and free the memory on each iteration,
instead of allocating for the maximum size upfront...
cudaResult = cudaMalloc((void **)&data, sz * sizeof(float));
if (cudaResult != cudaSuccess)
{
// throw or whatever
}
*/
curandResult = curandGenerateNormal(gen, data, sz, mean, stddev);
if (curandResult != CURAND_STATUS_SUCCESS)
{
// throw or whatever
}
/* If allocating on each iteration, need to free...
cudaResult = cudaFree(data);
if (cudaResult != cudaSuccess)
{
// throw or whatever
}
*/
}
cudaResult = cudaFree(data);
if (cudaResult != cudaSuccess)
{
// throw or whatever
}
curandResult = curandDestroyGenerator(&gen));
if (curandResult != CURAND_STATUS_SUCCESS)
{
// throw or whatever
}
En ce qui concerne votre commentaire, notez que curandGenerateNormalDouble va générer des nombres normalement distribués avec une moyenne donnée et l'écart-type, que les conflits avec votre condition qu'ils soient compris entre 0 et 1. Quelle distribution avez-vous besoin?
La fonction GenerateUniformDouble s'exécute correctement à l'intérieur de la boucle, mais nous avons besoin de curandGenerateNormalDouble pour produire le nombre entre 0 et 1. Veuillez nous aider. – Stratford
"curandGenerateNormalDouble plante avec" ... avec quoi ?! – Tom