Спасибо за отличный (и полный) пример. После постройки я обнаружил две проблемы.
Когда вы используете cudaMalloc to_device, вы хотите выделить num * sizeof (struct test) байтов.
Я предполагаю, что вы, возможно, захотите вызывать fill_mat более одного раза, или у вас могут быть другие ядра, и вы хотите, чтобы они каждый раз получали разные числа. Если это так, в конце fill_mat (или других ядер, которые делают копию curandState), вам нужно скопировать ваше локальное состояние обратно в curandState. Это потому, что curand продвигает состояние каждый раз, когда вы генерируете число.
Наконец (и это не обязательно ошибка). Я вижу, что вы используете идентификатор потока в качестве начального числа и последовательности в вызове curand_init. Это нормально, но существует некоторый (крайне маловероятный) риск того, что алгоритм скремблирования семян curand окажет вам влияние на часть последовательности, которая перекрывается с последовательностью какого-либо другого потока. curand_init использует скремблированную версию начального числа для генерации начального состояния, а затем применяет пропуск в 2 67 раз. Обычно цель состоит в том, чтобы все потоки использовали одно и то же начальное число, чтобы гарантировать, что каждый поток находится на расстоянии 2 * 67 от предыдущего в последовательности.
Паулс.