Вы объявляете размер разделяемой памяти = размер;как здесь
monteCarlo <<<dimGrid, dimBlock, size>>>
Значение размера = 512 * 65534 * 4 = 2 ^ 9 * 2 ^ 16 * 2 ^ 2 = 2 ^ 27 (больше максимального значения общей памяти на любой карте Iможно придумать).
Но, глядя на ваши ядра, я думаю, вы хотите, чтобы общая память была равна количеству потоков, которые у вас есть.
Так что вам нужно либо
1)
это для запуска ваших ядер
monteCarlo <<<dimGrid, dimBlock, (NUM_THREADS * sizeof(int))>>>
2)
Или используйте это для запуска ваших ядер
monteCarlo <<<dimGrid, dimBlock>>>
И это для объявления вашей общей памяти внутри вашего ядра.
__shared__ int sdata[NUM_THREADS]; // Note: no extern before __shared__
Я лично предпочитаю второй метод для ядер такого типа, потому что общая память пропорциональна количеству потоков, но число потоков, как известно, является постоянным.Это также немного быстрее.
РЕДАКТИРОВАТЬ
Помимо вышеупомянутых проблем, я сомневаюсь, что это тоже может вызывать проблемы.
cudaMalloc((void **) &devStates, size*sizeof(curandState));
BecuaseРазмер сам по себе такой.
size = NUM_BLOCKS * NUM_THREADS * sizeof(float);
Может быть, вы захотите сделать это вместо этого?
cudaMalloc((void **) &devStates, (NUM_BLOCKS *NUM_THREADS)*sizeof(curandState));
Что касается фактической проблемы переполнения стека, вы можете посмотреть на сообщение talonmies.