КАТЕГОРИИ:
АстрономияБиологияГеографияДругие языкиДругоеИнформатикаИсторияКультураЛитератураЛогикаМатематикаМедицинаМеханикаОбразованиеОхрана трудаПедагогикаПолитикаПравоПсихологияРиторикаСоциологияСпортСтроительствоТехнологияФизикаФилософияФинансыХимияЧерчениеЭкологияЭкономикаЭлектроника
|
Библиографический список. 3. NVIDIA Corp. “NVIDIA Compute PTX: Parallel Thread Execution” / NVIDIA Corp⇐ ПредыдущаяСтр 19 из 19 1. Metropolis, N., Ulam, S. The Monte Carlo Method // J. Amer. statistical assoc. 1949. V. 44. N 247. P. 335—341. 2. Соболь И.М. Метод Монте – Карло. / И.М. Соболь М.: Наука, 1985. 78 с. 3. NVIDIA Corp. “NVIDIA Compute PTX: Parallel Thread Execution” / NVIDIA Corp. 2701 San Tomas Expressway, Santa Clara, CA 95050: NVIDIA Corp. www.nvidia.com. 2008. 105 c. 4. NVIDIA Corp. “NVIDIA CUDA Compute Unified Device Architecture. Programming Guide Version 2.0” / NVIDIA Corp. 2701 San Tomas Expressway, Santa Clara, CA 95050: NVIDIA Corp. www.nvidia.com. 2008. 107 c. 5. NVIDIA Corp. “The CUDA Compiler Driver NVCC” / NVIDIA Corp. 2701 San Tomas Expressway, Santa Clara, CA 95050: NVIDIA Corp. www.nvidia.com. 2008. 31 c. 6. Боярченков, А.С., Поташников, С.И. Использование графических процессоров и технологии CUDA для задач молекулярной динамики // Вычислительные методы и программирование.- 2009.- № 10.- С. 9–23.- 7. Owens, J.D., Luebke, D., Govindaraju, N. et al. A Survey of General-Purpose Computation on Graphics Hardware // Computer Graphics Forum. 2007. V. 26. N. 1. 2007. P. 80-113. 8. Поташников, С.И., Боярченков, А.С., Некрасов, К.А., Купряжкин, А.Я., Рисованый, В.Д., Голованов, В.Н. Высокоскоростное моделирование диффузии ионов урана и кислорода в UO2 // Сборник рефератов и докладов семинара «Вопросы создания новых методик исследований и испытаний, сличительных экспериментов, аттестации и аккредитации» Димитровград, 22-23 ноября 2005 г. / НИИАР.- Димитровград, 2007.- С. 139–159. 9. Поташников, С.И., Боярченков, А.С., Некрасов, К.А., Купряжкин, А.Я. Молекулярно-динамическое восстановление межчастичных потенциалов в диоксиде урана по тепловому расширению // Альтернативная энергетика и экология.- 2007.- № 8.- С. 43–52.- 10. Kupryazhkin, A.Ya., Zhiganov, A.N., Nekrassov, K.A., Risovany, D.V., Risovany, V.D., Golovanov, V.N. Simulation of diffusion of oxygen and uranium in uranium dioxide nanocrystals // Journal of Nuclear Materials, 2008. V. 372. P. 233-238. 11. Matsumoto, M., Nishimura, T. A 623-Dimensionally Equidistributed Uniform Pseudo-Random Number Generator // ACM Trans. Model. Comput. Simul. 1998. V. 8. P. 3-30. 12. Marsaglia, G. A current view of random numbers // Computer Science and Statistics, Proceedings of the Sixteenth Simposium on The Interface. 1985. P. 3-10. 13. Hellekalek, P., Auer, T., Entacher, K., et al. The pLab // http://random.mat.sbg.ac.at. 14. Matsumoto, M., Nishimura, T. Dynamic Creation of Pseudorandom Number Generators // http://www.math.sci.hiroshima-u.ac.jp/~m-mat/MT/DC/dgene.pdf. 15. Podlozhnyuk V. Parallel Mersenne Twister / V. Podlozhnyuk. NVIDIA Corporation. 2007. Приложение. Приводимый ниже текст представляет собой вычислительное ядро из п. 3.2.3, оптимизированное в соответствии с п.3.2.5. По структуре и операциям этот код очень близок к тому, который подробно прокомментирован в п. 3.2.3. Поэтому, здесь мы ограничиваемся только краткими комментариями, отслеживающими основные блоки программы.
/* Вычислительное ядро, исполняется на графическом процессоре */ __global__ void MC_RandomGPU(float *d_Random, float *d_W_p, float *d_W_m, int N_Of_Steps) { const int tid = blockDim.x * blockIdx.x + threadIdx.x;
int iState, iState1, iStateM, iOut; unsigned int mti, mti1, mtiM, x; unsigned int mt[MT_NN];
/* Константы, характеризующие физику взаимодействия нейтронов с пластиной */ const float MC_h = 10.0f; // Толщина пластины const float MC_sigma = 1.1f; // Полное макросечение взаимодействия const float MC_sigma_S = 1.0f; /* Макросечение рассеяния, обратно средней длине свободного пробега */ const float MC_s = MC_sigma_S / MC_sigma; // Множитель веса нейтрона
mt_struct_stripped config = ds_MT[tid]; //Загрузка параметров Mersenne Twister из общей памяти
// Инициализация экземпляра Mersenne Twister mt[0] = config.seed; for(iState = 1; iState < MT_NN; iState++) mt[iState] = (1812433253U * (mt[iState - 1] ^ (mt[iState - 1] >> 30)) + iState) & MT_WMASK;
iState = 0; mti1 = mt[0];
/* Собственно моделирование прохождения нейтронов сквозь пластину */
float MC_x = 0.0f; // Положение нейтрона в пластине float MC_w = 1.0f; // Вес нейтрона float MC_m = 1.0f; // Косинус угла рассеяния нейтрона
float N_of_N = 0.0f; float W_p = 0.0f; float W_m = 0.0f;
for (int k = 0; k < N_Of_Steps; k++) { // Генерация случайной длины свободного пробега нейтрона iState1 = iState + 1; iStateM = iState + MT_MM; if(iState1 >= MT_NN) iState1 -= MT_NN; if(iStateM >= MT_NN) iStateM -= MT_NN; mti = mti1; mti1 = mt[iState1]; mtiM = mt[iStateM]; x = (mti & MT_UMASK) | (mti1 & MT_LMASK); x = mtiM ^ (x >> 1) ^ ((x & 1) ? config.matrix_a : 0); mt[iState] = x; iState = iState1; x ^= (x >> MT_SHIFT0); x ^= (x << MT_SHIFTB) & config.mask_b; x ^= (x << MT_SHIFTC) & config.mask_c; x ^= (x >> MT_SHIFT1); // Получение новой координаты нейтрона MC_x -= MC_m * (__logf(((float)x + 1.0f) / 4294967296.0f) / MC_sigma);
// Генерация косинуса случайной проекции нейтрона на ось x iState1 = iState + 1; iStateM = iState + MT_MM; if(iState1 >= MT_NN) iState1 -= MT_NN; if(iStateM >= MT_NN) iStateM -= MT_NN; mti = mti1; mti1 = mt[iState1]; mtiM = mt[iStateM]; x = (mti & MT_UMASK) | (mti1 & MT_LMASK); x = mtiM ^ (x >> 1) ^ ((x & 1) ? config.matrix_a : 0); mt[iState] = x; iState = iState1; // Tempering transformation x ^= (x >> MT_SHIFT0); x ^= (x << MT_SHIFTB) & config.mask_b; x ^= (x << MT_SHIFTC) & config.mask_c; x ^= (x >> MT_SHIFT1); // Получение значения косинуса MC_m = 2.0f*(((float)x + 1.0f) / 4294967296.0f) - 1.0f; /* Случайный косинус угла отклонения */
if ((MC_x < 0.0f) || (MC_x > MC_h)) { if (MC_x < 0.0f ) W_m += MC_w; else W_p += MC_w; N_of_N += 1.0f; MC_x = 0.0f; MC_w = 1.0f; MC_m = 1.0f; } else { MC_w *= MC_s; // Пересчёт веса нейтрона }
} // Завершение перемещения нейтронов внутри пластины __syncthreads();
// Сохранение результатов расчёта в общей памяти d_Random[tid] = N_of_N; d_W_p[tid] = W_p; d_W_m[tid] = W_m;
} // Завершение ядра
Учебное издание
|