Можете ли вы уточнить, что на самом деле происходит, когда он падает?Вы проверяете все значения ошибок?
Ваш цикл должен выглядеть примерно так, как показано ниже.Возможно ли, что cudaMalloc дает сбой без вашего ведома и, следовательно, вы передаете неверный указатель или что-то подобное?
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
}
Что касается вашего комментария, обратите внимание, что curandGenerateNormalDouble будет генерировать нормально распределенные числа с заданнымсреднее и стандартное отклонение, которое противоречит вашему требованию, чтобы они были между 0 и 1. Какое распределение вам нужно?