curandGenerateNormalDouble сбой с большим числом случайных чисел, которые будут сгенерированы - PullRequest
0 голосов
/ 10 ноября 2010

Есть ли ограничение для функции

curandGenerateNormal (генератор curandGenerator_t, float * outputPtr, size_t n, среднее значение с плавающей точкой, flod stddev)

функция?curandGenerateNormal вызывается внутри цикла, когда я увеличиваю размер параметра size_t n , код начинает падать, когда он вызывается несколько раз.

Есть идеи?

1 Ответ

1 голос
/ 10 ноября 2010

Можете ли вы уточнить, что на самом деле происходит, когда он падает?Вы проверяете все значения ошибок?

Ваш цикл должен выглядеть примерно так, как показано ниже.Возможно ли, что 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. Какое распределение вам нужно?

...