{"id":305990,"date":"2020-06-26T15:01:21","date_gmt":"2020-06-26T15:01:21","guid":{"rendered":"http:\/\/savepearlharbor.com\/?p=305990"},"modified":"-0001-11-30T00:00:00","modified_gmt":"-0001-11-29T21:00:00","slug":"","status":"publish","type":"post","link":"https:\/\/savepearlharbor.com\/?p=305990","title":{"rendered":"\u041f\u0435\u0440\u0435\u043d\u043e\u0441 \u043c\u043e\u043b\u0435\u043a\u0443\u043b\u044f\u0440\u043d\u043e\u0439 \u0434\u0438\u043d\u0430\u043c\u0438\u043a\u0438 \u043d\u0430 CUDA. \u0427\u0430\u0441\u0442\u044c I: \u041e\u0441\u043d\u043e\u0432\u044b"},"content":{"rendered":"\n<div class=\"post__text post__text-html post__text_v1\" id=\"post-content-body\" data-io-article-url=\"https:\/\/habr.com\/ru\/post\/508396\/\">\u0426\u0435\u043b\u044c \u0434\u0430\u043d\u043d\u043e\u0439 \u0441\u0442\u0430\u0442\u044c\u0438 \u2013 \u043f\u043e\u0434\u043d\u044f\u0442\u044c \u0432\u043e\u043f\u0440\u043e\u0441\u044b \u0440\u0430\u0441\u043f\u0430\u0440\u0430\u043b\u043b\u0435\u043b\u0438\u0432\u0430\u043d\u0438\u044f \u043a\u043e\u0434\u0430 \u043f\u0440\u043e\u0433\u0440\u0430\u043c\u043c\u044b \u0434\u043b\u044f \u0447\u0438\u0441\u043b\u0435\u043d\u043d\u043e\u0433\u043e \u043c\u043e\u0434\u0435\u043b\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u044f \u043c\u0435\u0442\u043e\u0434\u043e\u043c \u043c\u043e\u043b\u0435\u043a\u0443\u043b\u044f\u0440\u043d\u043e\u0439 \u0434\u0438\u043d\u0430\u043c\u0438\u043a\u0438 (\u041c\u0414) \u0441 \u043f\u043e\u043c\u043e\u0449\u044c\u044e \u0442\u0435\u0445\u043d\u043e\u043b\u043e\u0433\u0438\u0438 CUDA. \u0417\u0430\u0447\u0435\u043c \u044d\u0442\u043e \u0432\u043e\u043e\u0431\u0449\u0435 \u043d\u0443\u0436\u043d\u043e, \u0432\u0435\u0434\u044c \u0443\u0436\u0435 \u0441\u0443\u0449\u0435\u0441\u0442\u0432\u0443\u044e\u0442 \u043f\u0440\u043e\u0433\u0440\u0430\u043c\u043c\u043d\u044b\u0435 \u043f\u0430\u043a\u0435\u0442\u044b \u043f\u043e \u041c\u0414, \u0440\u0430\u0431\u043e\u0442\u0430\u044e\u0449\u0438\u0435 \u0432 \u0442\u043e\u043c \u0447\u0438\u0441\u043b\u0435 \u0438 \u043d\u0430 CUDA? \u0414\u0435\u043b\u043e \u0432 \u0442\u043e\u043c, \u0447\u0442\u043e \u044f \u0440\u0430\u0437\u0432\u0438\u0432\u0430\u044e \u0441\u0432\u043e\u044e \u0441\u043e\u0431\u0441\u0442\u0432\u0435\u043d\u043d\u0443\u044e \u043a\u043e\u043d\u0446\u0435\u043f\u0446\u0438\u044e \u00ab\u043d\u0435\u043f\u043e\u0441\u0442\u043e\u044f\u043d\u043d\u043e\u0433\u043e \u043f\u043e\u043b\u044f \u0441\u0438\u043b\u00bb (non-constant force field), \u043a\u043e\u0442\u043e\u0440\u0430\u044f \u043d\u0435 \u0440\u0435\u0430\u043b\u0438\u0437\u043e\u0432\u0430\u043d\u0430 \u0432 \u0441\u0443\u0449\u0435\u0441\u0442\u0432\u0443\u044e\u0449\u0438\u0445 \u041c\u0414-\u043f\u0440\u043e\u0433\u0440\u0430\u043c\u043c\u0430\u0445. <\/p>\n<p>  \u041f\u0435\u0440\u0435\u0434\u0435\u043b\u044b\u0432\u0430\u0442\u044c \u0447\u0443\u0436\u043e\u0439 \u043a\u043e\u0434 \u043f\u043e\u0434 \u044d\u0442\u0438 \u043d\u0443\u0436\u0434\u044b \u2013 \u0434\u043e\u0432\u043e\u043b\u044c\u043d\u043e \u043d\u0435\u0431\u043b\u0430\u0433\u043e\u0434\u0430\u0440\u043d\u043e\u0435 \u0437\u0430\u043d\u044f\u0442\u0438\u0435, \u043f\u043e\u044d\u0442\u043e\u043c\u0443 \u044f \u0432\u0437\u044f\u043b\u0441\u044f \u043f\u0435\u0440\u0435\u043d\u0435\u0441\u0442\u0438 \u0443\u0436\u0435 \u043d\u0430\u043f\u0438\u0441\u0430\u043d\u043d\u044b\u0439 \u0441\u0432\u043e\u0439 \u043f\u043e\u0441\u043b\u0435\u0434\u043e\u0432\u0430\u0442\u0435\u043b\u044c\u043d\u044b\u0439 \u043a\u043e\u0434 \u0438 \u0437\u0430\u043e\u0434\u043d\u043e \u043f\u043e\u0434\u0435\u043b\u0438\u0442\u0441\u044f \u043d\u0435\u043a\u043e\u0442\u043e\u0440\u044b\u043c\u0438 \u0440\u0430\u0437\u043c\u044b\u0448\u043b\u0435\u043d\u0438\u044f\u043c\u0438. \u041a\u0440\u043e\u043c\u0435 \u0442\u043e\u0433\u043e, \u044d\u0442\u043e \u043e\u0442\u0432\u0435\u0442 \u043d\u0430 \u0447\u0430\u0441\u0442\u043e \u043c\u0435\u043b\u044c\u043a\u0430\u044e\u0449\u0438\u0439 \u0437\u0434\u0435\u0441\u044c \u043a\u043e\u043c\u043c\u0435\u043d\u0442\u0430\u0440\u0438\u0439 \u043a \u0441\u0442\u0430\u0442\u044c\u044f\u043c \u043f\u043e CUDA, \u0432\u0440\u043e\u0434\u0435 <a href=\"https:\/\/habr.com\/ru\/company\/epam_systems\/blog\/245503\/#comment_8173777\">\u044d\u0442\u043e\u0433\u043e <\/a>.<\/p>\n<p>  \u0418\u0442\u0430\u043a, \u0447\u0442\u043e \u0436\u0435 \u0442\u0430\u043a\u043e\u0435 \u043c\u043e\u043b\u0435\u043a\u0443\u043b\u044f\u0440\u043d\u0430\u044f \u0434\u0438\u043d\u0430\u043c\u0438\u043a\u0430? \u041d\u0430 \u0425\u0430\u0431\u0440\u0435 \u0443\u0436\u0435 \u0435\u0441\u0442\u044c \u043d\u0435\u0441\u043a\u043e\u043b\u044c\u043a\u043e \u043f\u043e\u0441\u0442\u043e\u0432 \u043d\u0430 \u044d\u0442\u0443 \u0442\u0435\u043c\u0443, \u043d\u0430\u043f\u0440\u0438\u043c\u0435\u0440 <a href=\"https:\/\/habr.com\/ru\/post\/377845\/\">\u0437\u0434\u0435\u0441\u044c <\/a> \u0438\u043b\u0438 \u0432\u043e\u0442 <a href=\"https:\/\/habr.com\/ru\/post\/111413\/\">\u0437\u0434\u0435\u0441\u044c<\/a>. \u041a\u0440\u0430\u0442\u043a\u043e, \u041c\u0414 \u2013 \u044d\u0442\u043e \u043c\u0435\u0442\u043e\u0434, \u043f\u043e\u0437\u0432\u043e\u043b\u044f\u044e\u0449\u0438\u0439 \u043c\u043e\u0434\u0435\u043b\u0438\u0440\u043e\u0432\u0430\u0442\u044c \u0434\u0432\u0438\u0436\u0435\u043d\u0438\u0435 \u043c\u043d\u043e\u0436\u0435\u0441\u0442\u0432\u0430 \u0447\u0430\u0441\u0442\u0438\u0446 (\u0432 \u0442\u043e\u043c \u0447\u0438\u0441\u043b\u0435 \u0430\u0442\u043e\u043c\u043e\u0432, \u0438\u043e\u043d\u043e\u0432, \u043c\u043e\u043b\u0435\u043a\u0443\u043b) \u0438 \u0440\u0430\u0441\u0441\u0447\u0438\u0442\u044b\u0432\u0430\u0442\u044c \u043a\u043e\u043b\u043b\u0435\u043a\u0442\u0438\u0432\u043d\u044b\u0435 \u0441\u0432\u043e\u0439\u0441\u0442\u0432\u0430 \u0441\u0438\u0441\u0442\u0435\u043c\u044b, \u0437\u0430\u0432\u0438\u0441\u044f\u0449\u0438\u0435 \u043e\u0442 \u044d\u0442\u043e\u0433\u043e \u0434\u0432\u0438\u0436\u0435\u043d\u0438\u044f. \u041a\u0430\u043a \u044d\u0442\u043e \u0440\u0430\u0431\u043e\u0442\u0430\u0435\u0442? \u0414\u043e\u043f\u0443\u0441\u0442\u0438\u043c \u0434\u043b\u044f \u043c\u043d\u043e\u0436\u0435\u0441\u0442\u0432\u0430 \u0438\u0437 N \u0447\u0430\u0441\u0442\u0438\u0446 \u0437\u0430\u0434\u0430\u043d\u044b \u043d\u0435\u043a\u043e\u0442\u043e\u0440\u044b\u0435 \u043d\u0430\u0447\u0430\u043b\u044c\u043d\u044b\u0435 \u043a\u043e\u043e\u0440\u0434\u0438\u043d\u0430\u0442\u044b, \u0441\u043a\u043e\u0440\u043e\u0441\u0442\u0438, \u043c\u0430\u0441\u0441\u044b \u0438 (\u0433\u043b\u0430\u0432\u043d\u043e\u0435!) \u0437\u0430\u043a\u043e\u043d\u044b \u0432\u0437\u0430\u0438\u043c\u043e\u0434\u0435\u0439\u0441\u0442\u0432\u0438\u044f \u043c\u0435\u0436\u0434\u0443 \u043d\u0438\u043c\u0438. \u0418\u0437\u043c\u0435\u043d\u044f\u0435\u043c \u043a\u043e\u043e\u0440\u0434\u0438\u043d\u0430\u0442\u044b \u0441\u043e\u0433\u043b\u0430\u0441\u043d\u043e \u0441\u043a\u043e\u0440\u043e\u0441\u0442\u044f\u043c. \u041d\u0430 \u043e\u0441\u043d\u043e\u0432\u0435 \u0437\u0430\u043a\u043e\u043d\u043e\u0432 \u0432\u0437\u0430\u0438\u043c\u043e\u0434\u0435\u0439\u0441\u0442\u0432\u0438\u044f \u0432\u044b\u0447\u0438\u0441\u043b\u044f\u0435\u043c \u0441\u0438\u043b\u044b, \u0434\u0435\u0439\u0441\u0442\u0432\u0443\u044e\u0449\u0438\u0435 \u043c\u0435\u0436\u0434\u0443 \u0447\u0430\u0441\u0442\u0438\u0446\u0430\u043c\u0438. \u0420\u0430\u0437 \u0437\u043d\u0430\u0435\u043c \u0441\u0438\u043b\u0443 \u0438 \u043c\u0430\u0441\u0441\u0443 \u2013 \u0437\u043d\u0430\u0435\u043c \u0443\u0441\u043a\u043e\u0440\u0435\u043d\u0438\u0435. \u041f\u043e\u043f\u0440\u0430\u0432\u043b\u044f\u0435\u043c \u0441\u043a\u043e\u0440\u043e\u0441\u0442\u044c \u0441 \u0443\u0447\u0435\u0442\u043e\u043c \u0443\u0441\u043a\u043e\u0440\u0435\u043d\u0438\u044f. \u0418 \u0441\u043d\u043e\u0432\u0430 \u043f\u0435\u0440\u0435\u0445\u043e\u0434\u0438\u043c \u043a \u0438\u0437\u043c\u0435\u043d\u0435\u043d\u0438\u044e \u043a\u043e\u043e\u0440\u0434\u0438\u043d\u0430\u0442. \u0418 \u0442\u0430\u043a \u043f\u043e\u0432\u0442\u043e\u0440\u044f\u0435\u043c \u0442\u044b\u0441\u044f\u0447\u0438 \u0440\u0430\u0437, \u043f\u043e\u043a\u0430 <s>\u043d\u0435 \u043d\u0430\u0434\u043e\u0435\u0441\u0442<\/s> \u043d\u0435 \u043d\u0430\u0431\u0435\u0440\u0435\u043c \u0434\u043e\u0441\u0442\u0430\u0442\u043e\u0447\u043d\u0443\u044e \u0441\u0442\u0430\u0442\u0438\u0441\u0442\u0438\u043a\u0443.<\/p>\n<p>  <img decoding=\"async\" src=\"https:\/\/spectrum.ieee.org\/image\/MzU5MTAwMA.jpeg\" alt=\"image\"\/><br \/>  <a name=\"habracut\"><\/a><br \/>  \u0412 \u0440\u0435\u0430\u043b\u044c\u043d\u044b\u0445 \u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u044f\u0445 \u043f\u043e\u0441\u043b\u0435\u0434\u043e\u0432\u0430\u0442\u0435\u043b\u044c\u043d\u043e\u0441\u0442\u044c \u0432\u044b\u0447\u0438\u0441\u043b\u0435\u043d\u0438\u0439 \u00ab\u043a\u043e\u043e\u0440\u0434\u0438\u043d\u0430\u0442\u044b \u2013 \u0441\u043a\u043e\u0440\u043e\u0441\u0442\u0438 \u2013 \u0441\u0438\u043b\u044b\u00bb \u043d\u0435\u0441\u043a\u043e\u043b\u044c\u043a\u043e \u0441\u043b\u043e\u0436\u043d\u0435\u0435, \u043e\u0441\u043d\u043e\u0432\u0430\u043d\u044b \u043d\u0430 \u0440\u0430\u0437\u043b\u043e\u0436\u0435\u043d\u0438\u0438 \u0432 \u0440\u044f\u0434 \u0444\u0443\u043d\u043a\u0446\u0438\u0438 \u043a\u043e\u043e\u0440\u0434\u0438\u043d\u0430\u0442\u044b \u0447\u0430\u0441\u0442\u0438\u0446\u044b. \u041d\u0430\u0438\u0431\u043e\u043b\u0435\u0435 \u0440\u0430\u0441\u043f\u0440\u043e\u0441\u0442\u0440\u0430\u043d\u0435\u043d\u043d\u044b\u043c \u044f\u0432\u043b\u044f\u0435\u0442\u0441\u044f \u0441\u043a\u043e\u0440\u043e\u0441\u0442\u043d\u043e\u0439 \u0430\u043b\u0433\u043e\u0440\u0438\u0442\u043c \u0412\u0435\u0440\u043b\u0435 (<a href=\"https:\/\/en.wikipedia.org\/wiki\/Verlet_integration\">Velocity Verlet<\/a>). \u041f\u0441\u0435\u0432\u0434\u043e\u043a\u043e\u0434 \u041c\u0414 \u043f\u0440\u043e\u0433\u0440\u0430\u043c\u043c\u044b \u043d\u0430 \u043e\u0441\u043d\u043e\u0432\u0435 \u0438\u043d\u0442\u0435\u0433\u0440\u0430\u0442\u043e\u0440\u0430 \u0412\u0435\u0440\u043b\u0435 \u0432\u044b\u0433\u043b\u044f\u0434\u0438\u0442 \u0441\u043b\u0435\u0434\u0443\u044e\u0449\u0438\u043c \u043e\u0431\u0440\u0430\u0437\u043e\u043c:<\/p>\n<pre><code class=\"cpp\">init_md; int iStep = 0; while (iStep &lt; nStep) {     clear_cell_list;     verlet_1stage;     forces_calculation;     verlet_2stage;     temp_scale;     termostat;     some_output;     iStep++; } final_md;  <\/code><\/pre>\n<p>  \u041e\u0441\u043d\u043e\u0432\u043d\u043e\u0439 \u0446\u0438\u043a\u043b \u043f\u0440\u043e\u0433\u0440\u0430\u043c\u043c\u044b \u0432\u044b\u043f\u043e\u043b\u043d\u044f\u0435\u0442\u0441\u044f \u0437\u0430\u0434\u0430\u043d\u043d\u043e\u0435 \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u0435\u043c \u0447\u0438\u0441\u043b\u043e \u0440\u0430\u0437 (<b>nStep<\/b>). \u0418\u0442\u0435\u0440\u0430\u0446\u0438\u044f \u044d\u0442\u043e\u0433\u043e \u0446\u0438\u043a\u043b\u0430 \u043d\u0430\u0437\u044b\u0432\u0430\u0435\u0442\u0441\u044f \u0448\u0430\u0433\u043e\u043c \u043f\u043e \u0432\u0440\u0435\u043c\u0435\u043d\u0438 \u0438\u043b\u0438 \u043f\u0440\u043e\u0441\u0442\u043e \u0448\u0430\u0433\u043e\u043c (timestep). \u0424\u0443\u043d\u043a\u0446\u0438\u0438 <i>init_md<\/i>, <i>some_output<\/i> \u0438 <i>final_md<\/i> \u043c\u044b \u0440\u0430\u0441\u0441\u043c\u0430\u0442\u0440\u0438\u0432\u0430\u0442\u044c \u043d\u0435 \u0431\u0443\u0434\u0435\u043c, \u043e\u043d\u0438 \u0441\u0447\u0438\u0442\u044b\u0432\u0430\u044e\u0442 \u0432\u0445\u043e\u0434\u043d\u0443\u044e \u0438\u043d\u0444\u043e\u0440\u043c\u0430\u0446\u0438\u044e, \u0432\u044b\u0432\u043e\u0434\u044f\u0442 \u043f\u0440\u043e\u043c\u0435\u0436\u0443\u0442\u043e\u0447\u043d\u044b\u0435 \u0434\u0430\u043d\u043d\u044b\u0435, \u0432\u044b\u0434\u0435\u043b\u044f\u044e\u0442 \u0438 \u0432\u044b\u0441\u0432\u043e\u0431\u043e\u0436\u0434\u0430\u044e\u0442 \u043f\u0430\u043c\u044f\u0442\u044c \u0438 \u0442.\u0434. \u0421 \u0442\u043e\u0447\u043a\u0438 \u0437\u0440\u0435\u043d\u0438\u044f \u0432\u044b\u0432\u043e\u0434\u0430 \u0438\u043d\u0444\u043e\u0440\u043c\u0430\u0446\u0438\u0438, \u043c\u043e\u043b\u0435\u043a\u0443\u043b\u044f\u0440\u043d\u0430\u044f \u0434\u0438\u043d\u0430\u043c\u0438\u043a\u0430 \u0438\u0434\u0435\u0430\u043b\u044c\u043d\u0430 \u0434\u043b\u044f \u043f\u0440\u043e\u0432\u0435\u0434\u0435\u043d\u0438\u044f \u0440\u0430\u0441\u0447\u0435\u0442\u043e\u0432 \u043d\u0430 \u0432\u0438\u0434\u0435\u043e\u043a\u0430\u0440\u0442\u0435: \u0431\u043e\u043b\u044c\u0448\u0443\u044e \u0447\u0430\u0441\u0442\u044c \u0432\u044b\u0447\u0438\u0441\u043b\u0435\u043d\u0438\u0439 \u0432\u043e\u043e\u0431\u0449\u0435 \u043d\u0435\u0442 \u043d\u0435\u043e\u0431\u0445\u043e\u0434\u0438\u043c\u043e\u0441\u0442\u0438 \u0432\u044b\u0433\u0440\u0443\u0436\u0430\u0442\u044c.<\/p>\n<p>  \u0424\u0443\u043d\u043a\u0446\u0438\u0438 <i>verlet_1stage<\/i>, <i>verlet_2stage<\/i>, <i>temp_scale<\/i> \u0438 <i>termostat<\/i> \u043e\u0442\u043d\u043e\u0441\u044f\u0442\u0441\u044f \u043a \u0438\u043d\u0442\u0435\u0433\u0440\u0430\u0442\u043e\u0440\u0443 \u0443\u0440\u0430\u0432\u043d\u0435\u043d\u0438\u0439 \u0434\u0432\u0438\u0436\u0435\u043d\u0438\u044f \u0438 \u0443\u0447\u0435\u0442\u0443 \u0442\u0435\u043c\u043f\u0435\u0440\u0430\u0442\u0443\u0440\u044b. \u0424\u0443\u043d\u043a\u0446\u0438\u044f <i>forces_calculation<\/i> \u0432\u044b\u0447\u0438\u0441\u043b\u044f\u0435\u0442 \u0441\u0438\u043b\u044b, \u0434\u0435\u0439\u0441\u0442\u0432\u0443\u044e\u0449\u0438\u0435 \u043c\u0435\u0436\u0434\u0443 \u0447\u0430\u0441\u0442\u0438\u0446\u0430\u043c\u0438, \u0430 \u0444\u0443\u043d\u043a\u0446\u0438\u044f <i>clear_cell_list<\/i> \u043e\u0442\u043d\u043e\u0441\u0438\u0442\u0441\u044f \u043a \u0442\u0435\u0445\u043d\u0438\u043a\u0435 \u0443\u0441\u043a\u043e\u0440\u0435\u043d\u0438\u044f \u0432\u044b\u0447\u0438\u0441\u043b\u0435\u043d\u0438\u0439 (\u043e\u0431 \u044d\u0442\u043e\u043c \u043f\u043e\u0434\u0440\u043e\u0431\u043d\u0435\u0435 \u0434\u0430\u043b\u0435\u0435). <\/p>\n<p>  \u0420\u0430\u0441\u0441\u043c\u043e\u0442\u0440\u0438\u043c \u0432\u0441\u0435 \u044d\u0442\u0438 \u0433\u0440\u0443\u043f\u043f\u044b \u0444\u0443\u043d\u043a\u0446\u0438\u0439.<\/p>\n<h2>1 \u0418\u043d\u0442\u0435\u0433\u0440\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u0435 \u0443\u0440\u0430\u0432\u043d\u0435\u043d\u0438\u0439 \u0434\u0432\u0438\u0436\u0435\u043d\u0438\u044f<\/h2>\n<p>  \u0421\u0443\u0442\u044c \u043f\u0435\u0440\u0432\u043e\u0439 \u0441\u0442\u0430\u0434\u0438\u0438 \u0430\u043b\u0433\u043e\u0440\u0438\u0442\u043c\u0430 \u0412\u0435\u0440\u043b\u0435 \u043c\u043e\u0436\u043d\u043e \u0432\u044b\u0440\u0430\u0437\u0438\u0442\u044c \u0441\u043b\u0435\u0434\u0443\u044e\u0449\u0438\u043c\u0438 \u0444\u043e\u0440\u043c\u0443\u043b\u0430\u043c\u0438:<\/p>\n<p><math>$$display$$X = X + Vdt + \\frac{F}{m}dt^2$$display$$<\/math><\/p>\n<p>  <\/p>\n<p><math>$$display$$V = V + \\frac{F}{m}\\frac{dt}{2}. $$display$$<\/math><\/p>\n<p>  \u0412\u0442\u043e\u0440\u043e\u0439:  <\/p>\n<p><math>$$display$$V = V + \\frac{F}{m}\\frac{dt}{2},$$display$$<\/math><\/p>\n<p>  \u0433\u0434\u0435 X \u2013 \u043a\u043e\u043e\u0440\u0434\u0438\u043d\u0430\u0442\u0430 \u0447\u0430\u0441\u0442\u0438\u0446\u044b, V \u2013 \u0435\u0451 \u0441\u043a\u043e\u0440\u043e\u0441\u0442\u044c, F \u2013 \u0441\u0438\u043b\u0430 \u0434\u0435\u0439\u0441\u0442\u0432\u0443\u044e\u0449\u0430\u044f \u043d\u0430 \u043d\u0435\u0451, m \u2013 \u0435\u0451 \u043c\u0430\u0441\u0441\u0430 \u0438 dt \u2013 \u0448\u0430\u0433 \u043f\u043e \u0432\u0440\u0435\u043c\u0435\u043d\u0438. \u0412\u0441\u0435 \u044d\u0442\u043e \u043f\u0440\u0438\u043c\u0435\u043d\u044f\u0435\u0442\u0441\u044f \u043a\u043e \u0432\u0441\u0435\u043c \u0447\u0430\u0441\u0442\u0438\u0446\u0430\u043c \u0438, \u0435\u0441\u0442\u0435\u0441\u0442\u0432\u0435\u043d\u043d\u043e, \u043f\u0440\u043e\u0438\u0441\u0445\u043e\u0434\u0438\u0442 \u0432 3\u0445 \u0438\u0437\u043c\u0435\u0440\u0435\u043d\u0438\u044f\u0445, \u0438\u0442\u0430\u043a:<\/p>\n<pre><code class=\"cpp\">__global__ void verlet_1stage(int step, cudaMD *md) {   int i, t   float charge;   float engElecField = 0.0;\t\t\/\/ \u044d\u043d\u0435\u0440\u0433\u0438\u044f \u0432\u043e \u0432\u043d\u0435\u0448\u043d\u0435\u043c \u044d\u043b\u0435\u043a\u0442\u0440\u0438\u0447\u0435\u0441\u043a\u043e\u043c \u043f\u043e\u043b\u0435   __shared__ float shEngElField;\t\/\/ shared \u0432\u0435\u0440\u0441\u0438\u044f \u044d\u0442\u043e\u0439 \u043f\u0435\u0440\u0435\u043c\u0435\u043d\u043d\u043e\u0439    \/\/ \u0441\u0431\u0440\u043e\u0441\u0438\u043c \u044d\u043d\u0435\u0440\u0433\u0438\u044e     if (threadIdx.x == 0)     {         shEngElField = 0;         if (blockIdx.x == 0)         {             md-&gt;engElecField = 0;         }     }     __syncthreads();    \/\/ \u043e\u043f\u0440\u0435\u0434\u0435\u043b\u0438\u043c \u0434\u0438\u0430\u043f\u0430\u0437\u043e\u043d \u0447\u0430\u0441\u0442\u0438\u0446, \u0441 \u043a\u043e\u0442\u043e\u0440\u044b\u043c\u0438 \u0431\u0443\u0434\u0435\u0442 \u0440\u0430\u0431\u043e\u0442\u0430\u0442\u044c \u043f\u043e\u0442\u043e\u043a  int id0 = step * (blockIdx.x * blockDim.x + threadIdx.x);  int N = min(id0 + step, md-&gt;nAt);    for (i = id0; i &lt; N; i++)   {       t = md-&gt;types[i];      charge = md-&gt;specs[t].charge;       \/\/  v = v + f\/m * 0.5 dt      md-&gt;vls[i].x += md-&gt;rMasshdT[i] * md-&gt;frs[i].x;      md-&gt;vls[i].y += md-&gt;rMasshdT[i] * md-&gt;frs[i].y;      md-&gt;vls[i].z += md-&gt;rMasshdT[i] * md-&gt;frs[i].z;       \/\/ x = x + v * dt      md-&gt;xyz[i].x += md-&gt;vls[i].x * md-&gt;tSt;      md-&gt;xyz[i].y += md-&gt;vls[i].y * md-&gt;tSt;      md-&gt;xyz[i].z += md-&gt;vls[i].z * md-&gt;tSt;       put_periodic(&md-&gt;xyz[i], md-&gt;vls[i], md-&gt;masses[i], md-&gt;types[i], md);       keep_in_cell(i, md-&gt;xyz[i], md);       \/\/ \u0432\u043d\u0435\u0448\u043d\u0435\u0435 \u044d\u043b\u0435\u043a\u0442\u0440\u0438\u0447\u0435\u0441\u043a\u043e\u0435 \u043f\u043e\u043b\u0435      engElecField += charge * md-&gt;xyz[i].x * md-&gt;elecField.x; \/\/ Eng = q * x * dU\/dx   }    \/\/ \u0434\u043e\u0431\u0430\u0432\u043b\u044f\u0435\u043c \u044d\u043d\u0435\u0440\u0433\u0438\u044e \u043f\u043e\u043b\u044f \u0432 shared \u043f\u0435\u0440\u043c\u0435\u043d\u043d\u0443\u044e\u2026   atomicAdd(&shEngElField, engElecField);    __syncthreads();    \/\/.. \u0430 \u0437\u0430\u0442\u0435\u043c \u0432 \u0433\u043b\u043e\u0431\u0430\u043b\u044c\u043d\u0443\u044e   if (!threadIdx.x)   \/\/ 0th thread   {       atomicAdd(&md-&gt;engElecField, shEngElField);   } } <\/code><\/pre>\n<p>  \u0412\u0445\u043e\u0434\u043d\u043e\u0439 \u043f\u0430\u0440\u0430\u043c\u0435\u0442\u0440 <b>step <\/b>\u0440\u0430\u0432\u0435\u043d \u043a\u043e\u043b\u0438\u0447\u0435\u0441\u0442\u0432\u0443 \u0447\u0430\u0441\u0442\u0438\u0446 (\u0430\u0442\u043e\u043c\u043e\u0432) \u043e\u0431\u0440\u0430\u0431\u0430\u0442\u044b\u0432\u0430\u0435\u043c\u044b\u0445 \u043e\u0434\u043d\u0438\u043c \u043f\u043e\u0442\u043e\u043a\u043e\u043c. \u041f\u043e\u0441\u043a\u043e\u043b\u044c\u043a\u0443 \u0447\u0438\u0441\u043b\u043e \u0430\u0442\u043e\u043c\u043e\u0432 \u0432 \u0442\u0430\u043a\u0438\u0445 \u0440\u0430\u0441\u0447\u0435\u0442\u0430\u0445 \u043e\u0431\u044b\u0447\u043d\u043e \u043f\u043e\u0441\u0442\u043e\u044f\u043d\u043d\u043e, \u044d\u0442\u0438 \u043f\u0435\u0440\u0435\u043c\u0435\u043d\u043d\u044b\u0435 \u043c\u043e\u0436\u043d\u043e \u0432\u044b\u0447\u0438\u0441\u043b\u0438\u0442\u044c \u0440\u0430\u0437 \u0438 \u043d\u0430\u0432\u0441\u0435\u0433\u0434\u0430 \u0433\u0434\u0435-\u043d\u0438\u0431\u0443\u0434\u044c \u0432 \u0444\u0443\u043d\u043a\u0446\u0438\u0438 <i>init_md<\/i>. \u041f\u0430\u0440\u0430\u043c\u0435\u0442\u0440 <b>md <\/b>\u0442\u0438\u043f\u0430 *cudaMD \u2013 \u0441\u0441\u044b\u043b\u043a\u0430 \u043d\u0430 \u0441\u0442\u0440\u0443\u043a\u0442\u0443\u0440\u0443, \u0433\u0434\u0435 \u0441\u043e\u0434\u0435\u0440\u0436\u0430\u0442\u044c\u0441\u044f \u0441\u0441\u044b\u043b\u043a\u0438 \u043d\u0430 \u0432\u0441\u0435 \u043d\u0435\u043e\u0431\u0445\u043e\u0434\u0438\u043c\u044b\u0435 \u0434\u043b\u044f \u0440\u0430\u0441\u0447\u0435\u0442\u0430 \u043f\u0435\u0440\u0435\u043c\u0435\u043d\u043d\u044b\u0435, \u0442\u0430\u043a\u0438\u0435 \u043a\u0430\u043a:<\/p>\n<ul>\n<li><b>nAt<\/b> \u2013 \u0447\u0438\u0441\u043b\u043e \u0447\u0430\u0441\u0442\u0438\u0446;<\/li>\n<li><b>xyz<\/b> \u2013 \u043c\u0430\u0441\u0441\u0438\u0432 \u043a\u043e\u043e\u0440\u0434\u0438\u043d\u0430\u0442 \u0442\u0438\u043f\u0430 float3;<\/li>\n<li><b>vls<\/b> \u2013 \u043c\u0430\u0441\u0441\u0438\u0432 \u0441\u043a\u043e\u0440\u043e\u0441\u0442\u0435\u0439 \u0442\u0438\u043f\u0430 float3 (3 \u043a\u043e\u043c\u043f\u043e\u043d\u0435\u043d\u0442\u0430 \u0432\u0435\u043a\u0442\u043e\u0440\u0430);<\/li>\n<li><b>frs <\/b>\u2013 \u043c\u0430\u0441\u0441\u0438\u0432 \u0441\u0438\u043b (\u0442\u0430\u043a\u0436\u0435 3 \u043a\u043e\u043c\u043f\u043e\u043d\u0435\u0442\u0430 \u0432\u0435\u043a\u0442\u043e\u0440\u0430);<\/li>\n<li>\u043c\u0430\u0441\u0441\u0438\u0432 <b>rMasshdT <\/b>\u0445\u0440\u0430\u043d\u0438\u0442 \u0441\u0440\u0430\u0437\u0443 \u0432\u044b\u0440\u0430\u0436\u0435\u043d\u0438\u0435 0.5*dt*m \u0434\u043b\u044f \u043a\u0430\u0436\u0434\u043e\u0439 \u0447\u0430\u0441\u0442\u0438\u0446\u044b;<\/li>\n<li><b>types <\/b>\u2013 \u043c\u0430\u0441\u0441\u0438\u0432 \u0442\u0438\u043f\u043e\u0432 \u0447\u0430\u0441\u0442\u0438\u0446, \u0432\u0435\u0434\u044c \u0430\u0442\u043e\u043c\u044b \u043c\u043e\u0433\u0443\u0442 \u0431\u044b\u0442\u044c \u0440\u0430\u0437\u043d\u044b\u0435;<\/li>\n<li>\u043c\u0430\u0441\u0441\u0438\u0432 <b>spec <\/b>\u0445\u0440\u0430\u043d\u0438\u0442 \u0441\u0432\u043e\u0439\u0441\u0442\u0432\u0430 \u0447\u0430\u0441\u0442\u0438\u0446, \u043c\u0430\u0441\u0441\u0443, \u0437\u0430\u0440\u044f\u0434 \u0438 \u0442.\u0434. \u0427\u0442\u043e\u0431\u044b \u043f\u043e\u043b\u0443\u0447\u0438\u0442\u044c \u0441\u0432\u043e\u0439\u0441\u0442\u0432\u0430 i-\u043e\u0439 \u0447\u0430\u0441\u0442\u0438\u0446\u044b \u043d\u0443\u0436\u043d\u043e \u0441\u0434\u0435\u043b\u0430\u0442\u044c \u043e\u0431\u0440\u0430\u0449\u0435\u043d\u0438\u0435 \u0432\u0438\u0434\u0430 <b>spec[types[i]]<\/b>.<\/li>\n<\/ul>\n<p>  \u042f \u043e\u0431\u044a\u0435\u0434\u0438\u043d\u0438\u043b \u044d\u0442\u043e \u0432\u0441\u0451 \u0432 \u0441\u0442\u0440\u0443\u043a\u0442\u0443\u0440\u0443, \u0447\u0442\u043e\u0431\u044b \u043d\u0435 \u043f\u0435\u0440\u0435\u0434\u0430\u0432\u0430\u0442\u044c \u0432 \u0444\u0443\u043d\u043a\u0446\u0438\u044e \u043a\u0443\u0447\u0443 \u043f\u0430\u0440\u0430\u043c\u0435\u0442\u0440\u043e\u0432. \u0412\u043e\u0437\u043c\u043e\u0436\u043d\u043e, \u044d\u0442\u043e \u043d\u0435 \u043b\u0443\u0447\u0448\u0435\u0435 \u0440\u0435\u0448\u0435\u043d\u0438\u0435? \u041c\u043e\u0436\u0435\u0442 \u0431\u044b\u0442\u044c \u0441\u0442\u043e\u0438\u043b\u043e \u043e\u0431\u044a\u044f\u0432\u0438\u0442\u044c \u0438\u0445 \u0433\u043b\u043e\u0431\u0430\u043b\u044c\u043d\u044b\u043c\u0438 \u043f\u0435\u0440\u0435\u043c\u0435\u043d\u043d\u044b\u043c\u0438? \u041d\u0435 \u0432 \u0442\u043e\u043c \u0441\u043c\u044b\u0441\u043b\u0435, \u0447\u0442\u043e \u043e\u043d\u0438 \u043d\u0430\u0445\u043e\u0434\u044f\u0442\u0441\u044f \u0432 global memory, \u0430 \u0432 \u0442\u043e\u043c, \u0447\u0442\u043e \u043e\u043d\u0438 \u0432\u0438\u0434\u043d\u044b \u0432\u043e \u0432\u0441\u0435\u0445 \u0444\u0443\u043d\u043a\u0446\u0438\u044f\u0445 \u043f\u0440\u043e\u0433\u0440\u0430\u043c\u043c\u044b. \u0424\u0443\u043d\u043a\u0446\u0438\u044e <i>keep_in_cell<\/i> \u043e\u0431\u0441\u0443\u0434\u0438\u043c \u0432 \u0440\u0430\u0437\u0434\u0435\u043b\u0435 \u0443\u0441\u043a\u043e\u0440\u0435\u043d\u0438\u044f \u0432\u044b\u0447\u0438\u0441\u043b\u0435\u043d\u0438\u0439, \u0430 \u0444\u0443\u043d\u043a\u0446\u0438\u044f <i>put_periodic<\/i> \u043f\u043e\u043c\u0435\u0449\u0430\u0435\u0442 \u0447\u0430\u0441\u0442\u0438\u0446\u0443 \u0432 \u043c\u043e\u0434\u0435\u043b\u0438\u0440\u0443\u0435\u043c\u044b\u0439 \u043e\u0431\u044a\u0451\u043c (\u0431\u043e\u043a\u0441, box), \u0435\u0441\u043b\u0438 \u043e\u043d\u0430 \u0432\u044b\u043b\u0435\u0442\u0438\u0442 \u0437\u0430 \u0435\u0433\u043e \u043f\u0440\u0435\u0434\u0435\u043b\u044b (\u043a\u0430\u043a \u0432 \u043f\u0430\u043a\u043c\u0430\u043d\u0435, \u043a\u0430\u043a \u043c\u0435\u0442\u043a\u043e \u0432\u044b\u0440\u0430\u0437\u0438\u043b\u0441\u044f <a href=\"https:\/\/habr.com\/ru\/users\/dare\/\" class=\"user_link\">Dare<\/a> \u0432 \u0441\u0432\u043e\u0435\u043c \u043f\u043e\u0441\u0442\u0435 \u043f\u0440\u043e \u041c\u0414). \u041d\u0443 \u0438 \u0440\u0430\u0437 \u0443\u0436 \u043e\u043f\u0438\u0441\u0430\u043d\u043d\u0430\u044f \u0444\u0443\u043d\u043a\u0446\u0438\u044f \u0432\u044b\u043f\u043e\u043b\u043d\u044f\u0435\u0442 \u043e\u0431\u043d\u043e\u0432\u043b\u0435\u043d\u0438\u0435 \u043a\u043e\u043e\u0440\u0434\u0438\u043d\u0430\u0442 \u0447\u0430\u0441\u0442\u0438\u0446, \u0442\u043e \u0438\u043c\u0435\u0435\u0442 \u0441\u043c\u044b\u0441\u043b \u043f\u043e\u0441\u0447\u0438\u0442\u0430\u0442\u044c \u0432\u0441\u0435 \u044d\u043d\u0435\u0440\u0433\u0438\u0438, \u043a\u043e\u0442\u043e\u0440\u044b\u0435 \u0437\u0430\u0432\u0438\u0441\u044f\u0442 \u0442\u043e\u043b\u044c\u043a\u043e \u043e\u0442 \u043a\u043e\u043e\u0440\u0434\u0438\u043d\u0430\u0442, \u043d\u0430\u043f\u0440\u0438\u043c\u0435\u0440 \u044d\u043d\u0435\u0440\u0433\u0438\u044e \u0447\u0430\u0441\u0442\u0438\u0446 \u0432\u043e \u0432\u043d\u0435\u0448\u043d\u0435\u043c \u043f\u043e\u043b\u0435, \u0435\u0441\u043b\u0438 \u0442\u0430\u043a\u043e\u0432\u043e\u0435 \u0431\u044b\u043b\u043e \u0437\u0430\u0434\u0430\u043d\u043e. \u0412\u043e\u043f\u0440\u043e\u0441 \u043f\u043e \u0444\u0443\u043d\u043a\u0446\u0438\u0438 <i>verlet_1stage<\/i> \u0441\u043b\u0435\u0434\u0443\u044e\u0449\u0438\u0439: <font color=\"red\">\u043d\u0435\u043a\u043e\u0442\u043e\u0440\u044b\u0435 \u043f\u0435\u0440\u0435\u043c\u0435\u043d\u043d\u044b\u0435 (\u043a\u043e\u043e\u0440\u0434\u0438\u043d\u0430\u0442\u044b, \u0441\u043a\u043e\u0440\u043e\u0441\u0442\u0438 \u0438 \u0442.\u0434.) \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u044e\u0442\u0441\u044f \u043f\u043e \u043d\u0435\u0441\u043a\u043e\u043b\u044c\u043a\u0443 \u0440\u0430\u0437 \u0438 \u0446\u0435\u043b\u0435\u0441\u043e\u043e\u0431\u0440\u0430\u0437\u043d\u043e \u043b\u0438 \u0438\u0445 \u0441\u043d\u0430\u0447\u0430\u043b\u0430 \u0432\u044b\u0433\u0440\u0443\u0437\u0438\u0442\u044c \u0432 \u043a\u0430\u043a\u0443\u044e-\u0442\u043e \u0431\u043e\u043b\u0435\u0435 \u0431\u044b\u0441\u0442\u0440\u0443\u044e \u043f\u0430\u043c\u044f\u0442\u044c? \u0418\u043b\u0438 \u043a\u043e\u043c\u043f\u0438\u043b\u044f\u0442\u043e\u0440 \u0441\u0430\u043c \u0443\u043c\u0435\u0435\u0442 \u043e\u043f\u0442\u0438\u043c\u0438\u0437\u0438\u0440\u043e\u0432\u0430\u0442\u044c \u043f\u043e\u0434\u043e\u0431\u043d\u044b\u0435 \u0432\u0435\u0449\u0438?<\/font><\/p>\n<p>  \u0424\u0443\u043d\u043a\u0446\u0438\u044f <i>put_periodic<\/i> \u0434\u0435\u043b\u0430\u0435\u0442 \u0442\u0430\u043a, \u0447\u0442\u043e\u0431\u044b \u0447\u0430\u0441\u0442\u0438\u0446\u0430, \u0432\u044b\u043b\u0435\u0442\u0435\u0432\u0448\u0430\u044f \u0437\u0430 \u0433\u0440\u0430\u043d\u0438\u0446\u044b \u043c\u043e\u0434\u0435\u043b\u0438\u0440\u0443\u0435\u043c\u043e\u0439 \u043e\u0431\u043b\u0430\u0441\u0442\u0438 (\u0431\u043e\u043a\u0441\u0430) \u043f\u043e\u044f\u0432\u0438\u043b\u0430\u0441\u044c \u0441 \u0434\u0440\u0443\u0433\u043e\u0439 \u0435\u0451 \u0441\u0442\u043e\u0440\u043e\u043d\u044b (\u043f\u0435\u0440\u0438\u043e\u0434\u0438\u0447\u0435\u0441\u043a\u0438\u0435 \u0433\u0440\u0430\u043d\u0438\u0447\u043d\u044b\u0435 \u0443\u0441\u043b\u043e\u0432\u0438\u044f):<\/p>\n<pre><code class=\"cpp\">__device__ void put_periodic(float3& xyz, float3 vel, float mass, int type, cudaMD *md) {    if (xyz.x &lt; 0)    {       xyz.x += md-&gt;leng.x;        atomicAdd(&md-&gt;specAcBox[type].y, 1);        atomicAdd(&md-&gt;negMom.x, mass * (-vel.x));     }    else      if (xyz.x &gt;= md-&gt;leng.x)      {         xyz.x -= md-&gt;leng.x;          atomicAdd(&md-&gt;specAcBox[type].x, 1);         atomicAdd(&md-&gt;posMom.x, mass * vel.x);      } } <\/code><\/pre>\n<p>  \u0424\u0443\u043d\u043a\u0446\u0438\u044f \u0440\u0430\u0431\u043e\u0442\u0430\u0435\u0442 \u0434\u043b\u044f \u0431\u043e\u043a\u0441\u0430 \u0441 \u0433\u0435\u043e\u043c\u0435\u0442\u0440\u0438\u0435\u0439 \u043f\u0440\u044f\u043c\u043e\u0443\u0433\u043e\u043b\u044c\u043d\u043e\u0433\u043e \u043f\u0430\u0440\u0430\u043b\u043b\u0435\u043b\u0435\u043f\u0438\u043f\u0435\u0434\u0430. \u041a\u043e\u0434 \u043f\u0440\u0438\u0432\u0435\u0434\u0435\u043d \u0434\u043b\u044f \u0438\u0437\u043c\u0435\u0440\u0435\u043d\u0438\u044f x, \u043e\u0441\u0442\u0430\u043b\u044c\u043d\u044b\u0435 \u0438\u0437\u043c\u0435\u0440\u0435\u043d\u0438\u044f \u043f\u043e\u043b\u043d\u043e\u0441\u0442\u044c\u044e \u0430\u043d\u0430\u043b\u043e\u0433\u0438\u0447\u043d\u044b. \u041f\u043e\u043b\u044f <b>leng <\/b>\u0438 <b>revLeng <\/b>\u2013 \u0440\u0430\u0437\u043c\u0435\u0440 \u0431\u043e\u043a\u0441\u0430 \u0432 \u0441\u043e\u043e\u0442\u0432\u0435\u0442\u0441\u0442\u0432\u0443\u044e\u0449\u0435\u043c \u0438\u0437\u043c\u0435\u0440\u0435\u043d\u0438\u0438 \u0438 \u043e\u0431\u0440\u0430\u0442\u043d\u0430\u044f \u043e\u0442 \u043d\u0435\u0433\u043e \u0432\u0435\u043b\u0438\u0447\u0438\u043d\u0430. \u0412\u043e\u043e\u0431\u0449\u0435 \u0434\u043b\u044f \u0432\u043e\u0437\u0432\u0440\u0430\u0449\u0435\u043d\u0438\u044f \u0447\u0430\u0441\u0442\u0438\u0446\u044b \u0432 \u0431\u043e\u043a\u0441 \u043c\u043e\u0436\u043d\u043e \u043e\u0431\u043e\u0439\u0442\u0438\u0441\u044c \u0431\u0435\u0437 \u0443\u0441\u043b\u043e\u0432\u043d\u044b\u0445 \u043e\u043f\u0435\u0440\u0430\u0442\u043e\u0440\u043e\u0432:<\/p>\n<pre><code class=\"cpp\">xyz.x -= floor(xyz.x * md-&gt;revLeng.x) * md-&gt;leng.x;<\/code><\/pre>\n<p>  \u042f \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u043b \u0443\u0441\u043b\u043e\u0432\u043d\u044b\u0435 \u043e\u043f\u0435\u0440\u0430\u0442\u043e\u0440\u044b \u0432 \u043f\u043e\u0441\u043b\u0435\u0434\u043e\u0432\u0430\u0442\u0435\u043b\u044c\u043d\u043e\u0439 \u0432\u0435\u0440\u0441\u0438\u0438, \u043f\u043e\u0441\u043a\u043e\u043b\u044c\u043a\u0443 \u043c\u043d\u0435 \u043d\u0430\u0434\u043e \u0431\u044b\u043b\u043e \u0441\u0447\u0438\u0442\u0430\u0442\u044c \u043a\u043e\u043b\u0438\u0447\u0435\u0441\u0442\u0432\u043e \u0447\u0430\u0441\u0442\u0438\u0446, \u043f\u0440\u043e\u0448\u0435\u0434\u0448\u0438\u0445 \u0447\u0435\u0440\u0435\u0437 \u0433\u0440\u0430\u043d\u0438\u0446\u0443 \u0431\u043e\u043a\u0441\u0430 \u0438 \u0441\u0443\u043c\u043c\u0430\u0440\u043d\u044b\u0439 \u0438\u043c\u043f\u0443\u043b\u044c\u0441 \u044d\u0442\u0438\u0445 \u0447\u0430\u0441\u0442\u0438\u0446 (\u0438\u0437 \u043d\u0435\u0433\u043e \u043c\u043e\u0436\u043d\u043e \u0432\u044b\u0440\u0430\u0437\u0438\u0442\u044c \u0434\u0430\u0432\u043b\u0435\u043d\u0438\u0435). <font color=\"red\">\u0412 \u043f\u0440\u0438\u0432\u0435\u0434\u0435\u043d\u043d\u043e\u043c \u043a\u043e\u0434\u0435 \u0442\u0430\u043a\u0436\u0435 \u0432\u043a\u043b\u044e\u0447\u0435\u043d\u044b \u044d\u0442\u0438 \u0441\u0447\u0435\u0442\u0447\u0438\u043a\u0438, \u0432\u043e\u0437\u043c\u043e\u0436\u043d\u043e \u0434\u043b\u044f CUDA \u043d\u0430\u0434\u043e \u0431\u0443\u0434\u0435\u0442 \u043f\u043e\u0434\u0443\u043c\u0430\u0442\u044c, \u043a\u0430\u043a \u043e\u0431\u043e\u0439\u0442\u0438\u0441\u044c \u0431\u0435\u0437 if<\/font>.<\/p>\n<p>  \u0412\u0442\u043e\u0440\u0430\u044f \u0447\u0430\u0441\u0442\u044c \u0441\u043a\u043e\u0440\u043e\u0441\u0442\u043d\u043e\u0433\u043e \u0438\u043d\u0442\u0435\u0433\u0440\u0430\u0442\u043e\u0440\u0430 \u0412\u0435\u0440\u043b\u0435:<\/p>\n<pre><code class=\"cpp\">__global__ void verlet_2stage(int step, cudaMD *md) {   int i;   float kinE = 0.0;\t\t\/\/ \u043a\u0438\u043d\u0435\u0442\u0438\u0447\u0435\u0441\u043a\u0430\u044f \u044d\u043d\u0435\u0440\u0433\u0438\u044f   __shared__ float shKinE;\t\/\/ shared \u0432\u0435\u0440\u0441\u0438\u044f   int id0 = step * (blockIdx.x * blockDim.x + threadIdx.x);  int N = min(id0 + step, md-&gt;nAt);    \/\/ \u043e\u0431\u043d\u0443\u043b\u0438\u043c \u043a\u0438\u043d\u0435\u0442\u0438\u0447\u0435\u0441\u043a\u0443\u044e \u044d\u043d\u0435\u0440\u0433\u0438\u044e  if (threadIdx.x == 0)     {         shKinE = 0.0;         if (blockIdx.x == 0)         {             md-&gt;engKin = 0.0;         }  }   __syncthreads();     \/\/ v = v + f\/m * 0.5 dt   for (i = id0; i &lt; N; i++)   {     md-&gt;vls[i].x += md-&gt;rMasshdT[i] * md-&gt;frs[i].x;     md-&gt;vls[i].y += md-&gt;rMasshdT[i] * md-&gt;frs[i].y;     md-&gt;vls[i].z += md-&gt;rMasshdT[i] * md-&gt;frs[i].z;      \/\/ \u0441\u043e\u0445\u0440\u0430\u043d\u044f\u0435\u043c mv2     kinE += (md-&gt;vls[i].x * md-&gt;vls[i].x + md-&gt;vls[i].y  * md-&gt;vls[i].y + md-&gt;vls[i].z * md-&gt;vls[i].z) * md-&gt;masses[i];   }    \/\/ \u0441\u0443\u043c\u043c\u0438\u0440\u0443\u0435\u043c \u043a\u0438\u043d\u0435\u0442\u0438\u0447\u0435\u0441\u043a\u0443\u044e \u044d\u043d\u0435\u0440\u0433\u0438\u044e \u0441\u043d\u0430\u0447\u0430\u043b\u0430 \u0432 shared memory...   atomicAdd(&shKinE, 0.5 * kinE);   \/\/ kinE = mv2\/2   __syncthreads();   \/\/... \u0437\u0430\u0442\u0435\u043c \u0432 global memory   if (!threadIdx.x)      atomicAdd(&md-&gt;engKin, shKinE); } <\/code><\/pre>\n<p>  \u041a\u043e\u0434 \u043f\u043e \u0441\u0442\u0440\u0443\u043a\u0442\u0443\u0440\u0435 \u043f\u043e\u043b\u043d\u043e\u0441\u0442\u044c\u044e \u0430\u043d\u0430\u043b\u043e\u0433\u0438\u0447\u0435\u043d \u043f\u0435\u0440\u0432\u043e\u0439 \u0447\u0430\u0441\u0442\u0438 \u0438\u043d\u0442\u0435\u0433\u0440\u0430\u0442\u043e\u0440\u0430. \u041e\u0431\u043d\u043e\u0432\u043b\u044f\u0435\u043c \u0441\u043a\u043e\u0440\u043e\u0441\u0442\u0438 \u0434\u043b\u044f \u043a\u0430\u0436\u0434\u043e\u0439 \u0447\u0430\u0441\u0442\u0438\u0446\u044b, \u0441\u0443\u043c\u043c\u0438\u0440\u0443\u0435\u043c \u043a\u0438\u043d\u0435\u0442\u0438\u0447\u0435\u0441\u043a\u0443\u044e \u044d\u043d\u0435\u0440\u0433\u0438\u044e.<\/p>\n<p>  \u00ab\u0422\u0435\u043c\u043f\u0435\u0440\u0430\u0442\u0443\u0440\u043d\u044b\u0435\u00bb \u0444\u0443\u043d\u043a\u0446\u0438\u0438 <i>temp_scale<\/i> \u0438 <i>termostat<\/i>. \u041c\u043e\u043b\u0435\u043a\u0443\u043b\u044f\u0440\u043d\u044b\u0435 \u0441\u0438\u0441\u0442\u0435\u043c\u044b \u043e\u0442\u043b\u0438\u0447\u0430\u044e\u0442\u0441\u044f \u043e\u0442 \u043c\u0435\u0445\u0430\u043d\u0438\u0447\u0435\u0441\u043a\u0438\u0445 \u0442\u0435\u043c, \u0447\u0442\u043e \u0432 \u043d\u0438\u0445 \u0435\u0441\u0442\u044c \u043f\u043e\u043d\u044f\u0442\u0438\u0435 \u0442\u0435\u043c\u043f\u0435\u0440\u0430\u0442\u0443\u0440\u044b. \u041c\u0414 \u0443\u043d\u0430\u0441\u043b\u0435\u0434\u043e\u0432\u0430\u043b\u0430 \u043e\u043f\u0440\u0435\u0434\u0435\u043b\u0435\u043d\u0438\u0435 \u0442\u0435\u043c\u043f\u0435\u0440\u0430\u0442\u0443\u0440\u044b \u0438\u0437 <a href=\"https:\/\/ru.wikipedia.org\/wiki\/%D0%9C%D0%BE%D0%BB%D0%B5%D0%BA%D1%83%D0%BB%D1%8F%D1%80%D0%BD%D0%BE-%D0%BA%D0%B8%D0%BD%D0%B5%D1%82%D0%B8%D1%87%D0%B5%D1%81%D0%BA%D0%B0%D1%8F_%D1%82%D0%B5%D0%BE%D1%80%D0%B8%D1%8F\">\u043c\u043e\u043b\u0435\u043a\u0443\u043b\u044f\u0440\u043d\u043e-\u043a\u0438\u043d\u0435\u0442\u0438\u0447\u0435\u0441\u043a\u043e\u0439 \u0442\u0435\u043e\u0440\u0438\u0438<\/a>, \u0433\u0434\u0435 \u0442\u0435\u043c\u043f\u0435\u0440\u0430\u0442\u0443\u0440\u0430 \u2013 \u0432\u0435\u043b\u0438\u0447\u0438\u043d\u0430 \u043f\u0440\u043e\u043f\u043e\u0440\u0446\u0438\u043e\u043d\u0430\u043b\u044c\u043d\u0430\u044f \u0441\u0440\u0435\u0434\u043d\u0435\u043a\u0438\u043d\u0435\u0442\u0438\u0447\u0435\u0441\u043a\u043e\u0439 \u044d\u043d\u0435\u0440\u0433\u0438\u0438 \u0447\u0430\u0441\u0442\u0438\u0446 (\u0435\u0441\u0442\u044c \u043e\u0441\u043d\u043e\u0432\u0430\u043d\u0438\u044f \u043f\u043e\u043b\u0430\u0433\u0430\u0442\u044c, \u0447\u0442\u043e \u044d\u0442\u043e \u0437\u0430\u0431\u043b\u0443\u0436\u0434\u0435\u043d\u0438\u0435). \u0414\u043b\u044f \u043f\u043e\u0434\u0434\u0435\u0440\u0436\u0430\u043d\u0438\u044f \u043d\u0443\u0436\u043d\u043e\u0439 \u0442\u0435\u043c\u043f\u0435\u0440\u0430\u0442\u0443\u0440\u044b \u0432 \u0442\u0430\u043a\u0438\u0445 \u0442\u0435\u0440\u043c\u0438\u043d\u0430\u0445 \u043c\u043e\u0436\u043d\u043e \u043f\u0440\u043e\u0441\u0442\u043e \u043c\u0430\u0441\u0448\u0442\u0430\u0431\u0438\u0440\u043e\u0432\u0430\u0442\u044c \u0441\u043a\u043e\u0440\u043e\u0441\u0442\u0438 \u0447\u0430\u0441\u0442\u0438\u0446, \u044d\u0442\u043e \u0434\u0435\u043b\u0430\u0435\u0442 \u0444\u0443\u043d\u043a\u0446\u0438\u044f temp_scale:<\/p>\n<pre><code class=\"cpp\">__global__ void temp_scale(int atPerBlock, int atPerThread, cudaMD *md) {    float k;    int i;    int id0 = blockIdx.x * atPerBlock + threadIdx.x * atPerThread;    int N = min(id0 + atPerThread, md-&gt;nAt);     k = sqrt(md-&gt;teKin \/ md-&gt;engKin);    for (i = 0; i &lt; N; i++)    {       md-&gt;vls[i].x *= k;       md-&gt;vls[i].y *= k;       md-&gt;vls[i].z *= k;    }     if (!blockIdx.x)     if (!threadIdx.x)      {         md-&gt;engKin = md-&gt;teKin;      } }  <\/code><\/pre>\n<p>  \u041f\u043e\u043b\u0435 <b>teKin <\/b>\u0441\u043e\u0434\u0435\u0440\u0436\u0438\u0442 \u0446\u0435\u043b\u0435\u0432\u0443\u044e \u043a\u0438\u043d\u0435\u0442\u0438\u0447\u0435\u0441\u043a\u0443\u044e \u044d\u043d\u0435\u0440\u0433\u0438\u044e, \u043e\u043d\u0430 \u043f\u0440\u043e\u043f\u043e\u0440\u0446\u0438\u043e\u043d\u0430\u043b\u044c\u043d\u0430 \u0442\u0435\u043c\u043f\u0435\u0440\u0430\u0442\u0443\u0440\u0435, \u0443\u0441\u0442\u0430\u043d\u043e\u0432\u043b\u0435\u043d\u043d\u043e\u0439 \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u0435\u043c. \u0424\u0443\u043d\u043a\u0446\u0438\u044f \u043f\u0440\u043e\u0441\u0442\u043e \u0434\u043e\u043c\u043d\u043e\u0436\u0430\u0435\u0442 \u0432\u0441\u0435 \u043a\u043e\u043c\u043f\u043e\u043d\u0435\u043d\u0442\u044b \u0432\u0435\u043a\u0442\u043e\u0440\u043e\u0432 \u0441\u043a\u043e\u0440\u043e\u0441\u0442\u0435\u0439 \u043d\u0430 \u0432\u0435\u043b\u0438\u0447\u0438\u043d\u0443 k, \u0430 \u0437\u0430\u0442\u0435\u043c \u043e\u0434\u0438\u043d \u043f\u043e\u0442\u043e\u043a \u0443\u0441\u0442\u0430\u043d\u0430\u0432\u043b\u0438\u0432\u0430\u0435\u0442 \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u0435 \u043a\u0438\u043d\u0435\u0442\u0438\u0447\u0435\u0441\u043a\u043e\u0439 \u044d\u043d\u0435\u0440\u0433\u0438\u0438 \u0440\u0430\u0432\u043d\u043e\u0439 \u0437\u0430\u0434\u0430\u043d\u043d\u043e\u0439. <font color=\"red\">\u0417\u0434\u0435\u0441\u044c \u043f\u0435\u0440\u0435\u043c\u0435\u043d\u043d\u0430\u044f <b>k <\/b>\u043e\u043f\u0440\u0435\u0434\u0435\u043b\u044f\u0435\u0442\u0441\u044f \u0432 \u043a\u0430\u0436\u0434\u043e\u043c \u043f\u043e\u0442\u043e\u043a\u0435, \u0445\u043e\u0442\u044f \u0432\u043e\u0437\u043c\u043e\u0436\u043d\u043e \u0435\u0451 \u043d\u0430\u0434\u043e \u043e\u043f\u0440\u0435\u0434\u0435\u043b\u0438\u0442\u044c \u0432 \u043e\u0434\u043d\u043e\u043c (\u043f\u043e\u0441\u043a\u043e\u043b\u044c\u043a\u0443 \u043e\u043d\u0430 \u043e\u0434\u0438\u043d\u0430\u043a\u043e\u0432\u0430\u044f), \u0447\u0442\u043e\u0431\u044b \u043d\u0435 \u0434\u0435\u043b\u0430\u0442\u044c \u043b\u0438\u0448\u043d\u0435\u0439 \u0440\u0430\u0431\u043e\u0442\u044b, \u0442\u0435\u043c \u0431\u043e\u043b\u0435\u0435 \u0447\u0442\u043e \u0442\u0430\u043c \u0443\u0447\u0430\u0441\u0442\u0432\u0443\u0435\u0442 \u043a\u0432\u0430\u0434\u0440\u0430\u0442\u043d\u044b\u0439 \u043a\u043e\u0440\u0435\u043d\u044c.<\/font> \u0422\u0430\u043a\u043e\u0435 \u043f\u0440\u0438\u043c\u0438\u0442\u0438\u0432\u043d\u043e\u0435 \u043c\u0430\u0441\u0448\u0442\u0430\u0431\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u0435 \u0442\u0435\u043c\u043f\u0435\u0440\u0430\u0442\u0443\u0440\u044b \u043f\u0440\u0438\u043c\u0435\u043d\u044f\u0435\u0442\u0441\u044f \u043e\u0431\u044b\u0447\u043d\u043e \u043d\u0430 \u043f\u0440\u0435\u0434\u0432\u0430\u0440\u0438\u0442\u0435\u043b\u044c\u043d\u044b\u0445 \u044d\u0442\u0430\u043f\u0430\u0445 \u043c\u043e\u0434\u0435\u043b\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u044f (equilibration period) \u0441 \u0447\u0430\u0441\u0442\u043e\u0442\u043e\u0439 \u0440\u0430\u0437 \u0432 \u043d\u0435\u0441\u043a\u043e\u043b\u044c\u043a\u043e \u0448\u0430\u0433\u043e\u0432. \u0411\u043e\u043b\u0435\u0435 \u0445\u0438\u0442\u0440\u044b\u0435 \u0430\u043b\u0433\u043e\u0440\u0438\u0442\u043c\u044b \u043f\u043e\u0434\u0434\u0435\u0440\u0436\u0430\u043d\u0438\u044f \u0442\u0435\u043c\u043f\u0435\u0440\u0430\u0442\u0443\u0440\u044b (\u0442\u0435\u0440\u043c\u043e\u0441\u0442\u0430\u0442\u044b) \u0438\u043c\u0438\u0442\u0438\u0440\u0443\u044e\u0442 \u0441\u0442\u043e\u043b\u043a\u043d\u043e\u0432\u0435\u043d\u0438\u044f \u0447\u0430\u0441\u0442\u0438\u0446 \u0441 \u043d\u0435\u043a\u043e\u0442\u043e\u0440\u044b\u043c \u0440\u0435\u0437\u0435\u0440\u0432\u0443\u0430\u0440\u043e\u043c \u0437\u0430\u0434\u0430\u043d\u043d\u043e\u0439 \u0442\u0435\u043c\u043f\u0435\u0440\u0430\u0442\u0443\u0440\u044b, \u043d\u0430\u0438\u0431\u043e\u043b\u0435\u0435 \u043f\u043e\u043f\u0443\u043b\u044f\u0440\u043d\u044b\u0439 \u2013 \u0442\u0435\u0440\u043c\u043e\u0441\u0442\u0430\u0442 <a href=\"https:\/\/en.wikipedia.org\/wiki\/Nos%C3%A9%E2%80%93Hoover_thermostat\">\u041d\u043e\u0437\u0435-\u0413\u0443\u0432\u0435\u0440\u0430<\/a>:<\/p>\n<pre><code class=\"cpp\">__global__ void tstat_nose(int step, cudaMD *md) {    int i;     if (!blockIdx.x)      if (!threadIdx.x)            md-&gt;chit += md-&gt;tSt * (md-&gt;engKin - md-&gt;teKin) * md-&gt;rQmass;    __synctreads();     float scale = 1.0 - md-&gt;tSt * md-&gt;chit;    int id0 = step * (blockIdx.x * blockDim.x + threadIdx.x);   int N = min(id0 + step, md-&gt;nAt);     for (i = id0; i &lt; N; i++)    {        md-&gt;vls[i].x *= scale;        md-&gt;vls[i].y *= scale;        md-&gt;vls[i].z *= scale;    }     if (!blockIdx.x)      if (!threadIdx.x)         {         md-&gt;engKin = md-&gt;engKin * scale * scale;         md-&gt;consInt += md-&gt;tSt * md-&gt;chit * md-&gt;qMassTau2;         md-&gt;chit += md-&gt;tSt * (md-&gt;engKin - md-&gt;teKin) * md-&gt;rQmass;       } } <\/code><\/pre>\n<p>  \u041e\u0442\u043b\u0438\u0447\u0438\u0435 \u043e\u0442 \u043f\u0440\u0435\u0434\u044b\u0434\u0443\u0449\u0435\u0439 \u0444\u0443\u043d\u043a\u0446\u0438\u0438 \u043b\u0438\u0448\u044c \u0432 \u0431\u043e\u043b\u0435\u0435 \u0441\u043b\u043e\u0436\u043d\u043e\u043c \u043e\u043f\u0440\u0435\u0434\u0435\u043b\u0435\u043d\u0438\u0438 \u043f\u043e\u043f\u0440\u0430\u0432\u043e\u0447\u043d\u043e\u0433\u043e \u043a\u043e\u044d\u0444\u0444\u0438\u0446\u0438\u0435\u043d\u0442\u0430.<\/p>\n<p>  \u041f\u043e\u0434\u0432\u0435\u0434\u0435\u043c \u0438\u0442\u043e\u0433 \u043a\u0430\u0441\u0430\u0442\u0435\u043b\u044c\u043d\u043e \u044d\u0442\u043e\u0439 \u0433\u0440\u0443\u043f\u043f\u044b \u0444\u0443\u043d\u043a\u0446\u0438\u0439. \u0412\u0441\u0435 \u043e\u043d\u0438 \u043f\u0440\u0435\u043a\u0440\u0430\u0441\u043d\u043e \u043f\u0430\u0440\u0430\u043b\u043b\u0435\u043b\u0438\u0437\u0443\u044e\u0442\u0441\u044f \u0438 \u043d\u0435 \u0442\u043e\u043b\u044c\u043a\u043e \u043f\u043e\u0442\u043e\u043c\u0443, \u0447\u0442\u043e \u0432\u044b\u043f\u043e\u043b\u043d\u044f\u044e\u0442 \u0430\u0431\u0441\u043e\u043b\u044e\u0442\u043d\u043e \u043e\u0434\u0438\u043d\u0430\u043a\u043e\u0432\u044b\u0435 \u0434\u0435\u0439\u0441\u0442\u0432\u0438\u044f \u043a\u043e \u0432\u0441\u0435\u043c \u0447\u0430\u0441\u0442\u0438\u0446\u0430\u043c, \u043d\u043e \u0438 \u043f\u043e\u0442\u043e\u043c\u0443, \u0447\u0442\u043e \u043d\u0435 \u0442\u0440\u0435\u0431\u0443\u044e\u0442 \u043f\u0435\u0440\u0435\u043a\u0440\u0451\u0441\u0442\u043d\u044b\u0445 \u0441\u0441\u044b\u043b\u043e\u043a. \u041f\u043e\u0442\u043e\u043a, \u043e\u0431\u0440\u0430\u0431\u0430\u0442\u044b\u0432\u0430\u044f \u043c\u0430\u0441\u0441\u0438\u0432\u044b \u0441 \u0438\u043d\u0434\u0435\u043a\u0441\u043e\u043c i, \u043d\u0435 \u043e\u0431\u0440\u0430\u0449\u0430\u0435\u0442\u0441\u044f \u043a \u0438\u043d\u0434\u0435\u043a\u0441\u0443 j, \u043d\u0435\u0442 \u043a\u043e\u043d\u0444\u043b\u0438\u043a\u0442\u0430 \u0434\u043e\u0441\u0442\u0443\u043f\u0430 \u043a \u043e\u0434\u043d\u0438\u043c \u0438 \u0442\u0435\u043c \u0436\u0435 \u0434\u0430\u043d\u043d\u044b\u043c.<\/p>\n<h3>2 \u0412\u044b\u0447\u0438\u0441\u043b\u0435\u043d\u0438\u0435 \u0441\u0438\u043b \u0438 \u0441\u043f\u0438\u0441\u043e\u043a \u044f\u0447\u0435\u0435\u043a<\/h3>\n<p>  \u0412 \u043c\u043e\u043b\u0435\u043a\u0443\u043b\u044f\u0440\u043d\u044b\u0445 \u0441\u0438\u0441\u0442\u0435\u043c\u0430\u0445 \u043e\u0441\u043d\u043e\u0432\u043d\u043e\u0439 \u0438\u0441\u0442\u043e\u0447\u043d\u0438\u043a \u0441\u0438\u043b, \u0434\u0435\u0439\u0441\u0442\u0432\u0443\u044e\u0449\u0438\u0439 \u043d\u0430 \u0447\u0430\u0441\u0442\u0438\u0446\u0443 (\u043a\u0440\u043e\u043c\u0435 \u0443\u0436\u0435 \u0443\u043f\u043e\u043c\u044f\u043d\u0443\u0442\u044b\u0445 \u0432\u043d\u0435\u0448\u043d\u0438\u0445 \u043f\u043e\u043b\u0435\u0439) \u2013 \u044d\u0442\u043e \u0434\u0440\u0443\u0433\u0438\u0435 \u0447\u0430\u0441\u0442\u0438\u0446\u044b. \u0412\u044b\u0447\u0438\u0441\u043b\u0435\u043d\u0438\u0435 \u044d\u0442\u0438\u0445 \u0441\u0438\u043b \u0438 \u0435\u0441\u0442\u044c \u043d\u0430\u0438\u0431\u043e\u043b\u0435\u0435 \u0441\u043b\u043e\u0436\u043d\u0430\u044f, \u0442\u0440\u0443\u0434\u043e\u0435\u043c\u043a\u0430\u044f \u0438 \u043d\u0435\u043e\u0434\u043d\u043e\u0437\u043d\u0430\u0447\u043d\u0430\u044f \u0447\u0430\u0441\u0442\u044c \u041c\u0414. \u041e\u0434\u043d\u043e \u0438\u0437 \u043f\u0440\u043e\u0441\u0442\u0435\u0439\u0448\u0438\u0445 \u043f\u0440\u0438\u0431\u043b\u0438\u0436\u0435\u043d\u0438\u0439 \u0437\u0430\u043a\u043b\u044e\u0447\u0430\u0435\u0442\u0441\u044f \u0432 \u0442\u043e\u043c, \u0447\u0442\u043e \u0432\u0441\u0435 \u0432\u0437\u0430\u0438\u043c\u043e\u0434\u0435\u0439\u0441\u0442\u0432\u0438\u044f \u0432 \u0441\u0438\u0441\u0442\u0435\u043c\u0435 \u043f\u0440\u0435\u0434\u0441\u0442\u0430\u0432\u043b\u044f\u044e\u0442 \u0441\u0443\u043c\u043c\u043e\u0439 \u0432\u0437\u0430\u0438\u043c\u043e\u0434\u0435\u0439\u0441\u0442\u0432\u0438\u0439 \u043c\u0435\u0436\u0434\u0443 \u041a\u0410\u0416\u0414\u041e\u0419 \u043f\u0430\u0440\u043e\u0439 \u0447\u0430\u0441\u0442\u0438\u0446 (\u043f\u0430\u0440\u043d\u043e\u0435 \u043f\u0440\u0438\u0431\u043b\u0438\u0436\u0435\u043d\u0438\u0435). \u0414\u043b\u044f \u044d\u0442\u0438\u0445 \u0446\u0435\u043b\u0435\u0439 \u0432\u0432\u043e\u0434\u044f\u0442 \u043f\u0430\u0440\u043d\u044b\u0439 \u043f\u043e\u0442\u0435\u043d\u0446\u0438\u0430\u043b \u2013 \u0444\u0443\u043d\u043a\u0446\u0438\u043e\u043d\u0430\u043b\u044c\u043d\u0443\u044e \u0437\u0430\u0432\u0438\u0441\u0438\u043c\u043e\u0441\u0442\u044c \u043f\u043e\u0442\u0435\u043d\u0446\u0438\u0430\u043b\u044c\u043d\u043e\u0439 \u044d\u043d\u0435\u0440\u0433\u0438\u0438 \u0432\u0437\u0430\u0438\u043c\u043e\u0434\u0435\u0439\u0441\u0442\u0432\u0438\u044f \u0434\u0432\u0443\u0445 \u0447\u0430\u0441\u0442\u0438\u0446 \u043e\u0442 \u0440\u0430\u0441\u0441\u0442\u043e\u044f\u043d\u0438\u044f \u043c\u0435\u0436\u0434\u0443 \u043d\u0438\u043c\u0438. \u041d\u0430\u0438\u0431\u043e\u043b\u0435\u0435 \u0438\u0437\u0432\u0435\u0441\u0442\u043d\u044b\u0435 \u043f\u0430\u0440\u043d\u044b\u0435 \u043f\u043e\u0442\u0435\u043d\u0446\u0438\u0430\u043b\u044b: \u043f\u043e\u0442\u0435\u043d\u0446\u0438\u0430\u043b <a href=\"https:\/\/en.wikipedia.org\/wiki\/Lennard-Jones_potential\">\u041b\u0435\u043d\u043d\u0430\u0440\u0434-\u0414\u0436\u043e\u043d\u0441\u0430<\/a> (\u0438\u043b\u0438 \u00ab6-12\u00bb), <a href=\"https:\/\/en.wikipedia.org\/wiki\/Buckingham_potential\">\u0411\u0443\u043a\u0438\u043d\u0433\u0435\u043c\u0430 <\/a>\u0438 \u0411\u043e\u0440\u043d-\u041c\u0430\u0439\u0435\u0440\u0430-\u0425\u0430\u0433\u0433\u0438\u043d\u0441\u0430. \u0414\u043b\u044f \u043f\u0440\u0438\u043c\u0435\u0440\u0430 \u043f\u0440\u0438\u0432\u0435\u0434\u0443 \u0430\u043d\u0430\u043b\u0438\u0442\u0438\u0447\u0435\u0441\u043a\u0438\u0435 \u0432\u044b\u0440\u0430\u0436\u0435\u043d\u0438\u044f \u043f\u0435\u0440\u0432\u044b\u0445 \u0434\u0432\u0443\u0445:  <\/p>\n<p><math>$$display$$U=4\\epsilon(\\frac{\\sigma^6}{r^6}-\\frac{\\sigma^{12}}{r^{12}})$$display$$<\/math><\/p>\n<p>\u0438  <\/p>\n<p><math>$$display$$U=A\\exp(-\\frac{r}{\\rho})-\\frac{C}{r^6},$$display$$<\/math><\/p>\n<p>  \u0433\u0434\u0435 U \u2013 \u043f\u043e\u0442\u0435\u043d\u0446\u0438\u0430\u043b\u044c\u043d\u0430\u044f \u044d\u043d\u0435\u0440\u0433\u0438\u044f \u043f\u0430\u0440\u044b \u0447\u0430\u0441\u0442\u0438\u0446, r \u2013 \u0440\u0430\u0441\u0441\u0442\u043e\u044f\u043d\u0438\u0435 \u043c\u0435\u0436\u0434\u0443 \u0447\u0430\u0441\u0442\u0438\u0446\u0430\u043c\u0438, \u0430 \u0432\u0441\u0435 \u043e\u0441\u0442\u0430\u043b\u044c\u043d\u044b\u0435 \u0431\u0443\u043a\u0432\u044b \u2013 \u043f\u0430\u0440\u0430\u043c\u0435\u0442\u0440\u044b, \u043a\u043e\u0442\u043e\u0440\u044b\u0435 \u0437\u0430\u0432\u0438\u0441\u044f\u0442 \u0442\u043e\u043b\u044c\u043a\u043e \u043e\u0442 \u0442\u0438\u043f\u0430 \u0432\u0437\u0430\u0438\u043c\u043e\u0434\u0435\u0439\u0441\u0442\u0432\u0443\u044e\u0449\u0438\u0445 \u0447\u0430\u0441\u0442\u0438\u0446 \u0438 \u0437\u0430\u0434\u0430\u043d\u044b \u043d\u0430 \u044d\u0442\u0430\u043f\u0435 \u0438\u043d\u0438\u0446\u0438\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u0438. \u041e\u0434\u043d\u0430\u043a\u043e \u0434\u0430\u0436\u0435 \u0431\u043e\u043b\u044c\u0448\u0435, \u0447\u0435\u043c \u044d\u043d\u0435\u0440\u0433\u0438\u044f \u043d\u0430\u0441 \u0438\u043d\u0442\u0435\u0440\u0435\u0441\u0443\u044e\u0442 \u0441\u0438\u043b\u044b \u0432\u0437\u0430\u0438\u043c\u043e\u0434\u0435\u0439\u0441\u0442\u0432\u0438\u044f \u043c\u0435\u0436\u0434\u0443 \u044d\u0442\u0438\u043c\u0438 \u0447\u0430\u0441\u0442\u0438\u0446\u0430\u043c\u0438. \u0421\u0438\u043b\u044b \u043d\u0430\u0445\u043e\u0434\u044f\u0442\u0441\u044f \u0442\u0440\u0438\u0432\u0438\u0430\u043b\u044c\u043d\u043e, \u0447\u0435\u0440\u0435\u0437 \u043f\u0440\u043e\u0438\u0437\u0432\u043e\u0434\u043d\u0443\u044e \u043f\u0430\u0440\u043d\u043e\u0433\u043e \u043f\u043e\u0442\u0435\u043d\u0446\u0438\u0430\u043b\u0430, \u0434\u043b\u044f \u043a\u043e\u0442\u043e\u0440\u043e\u0439 \u0442\u0430\u043a\u0436\u0435 \u043d\u0435\u0441\u043b\u043e\u0436\u043d\u043e \u043f\u043e\u043b\u0443\u0447\u0438\u0442\u044c \u0430\u043d\u0430\u043b\u0438\u0442\u0438\u0447\u0435\u0441\u043a\u043e\u0435 \u0432\u044b\u0440\u0430\u0436\u0435\u043d\u0438\u0435 \u0438 \u0437\u0430\u0448\u0438\u0442\u044c \u0432 \u043f\u0440\u043e\u0433\u0440\u0430\u043c\u043c\u0443. \u0418, \u043f\u043e\u0441\u043a\u043e\u043b\u044c\u043a\u0443 \u0441\u0438\u043b\u0430 \u0434\u0435\u0439\u0441\u0442\u0432\u0438\u044f \u0440\u0430\u0432\u043d\u0430 \u0441\u0438\u043b\u0435 \u043f\u0440\u043e\u0442\u0438\u0432\u043e\u0434\u0435\u0439\u0441\u0442\u0432\u0438\u044f, \u043c\u044b \u0441\u0440\u0430\u0437\u0443 \u043f\u043e\u043b\u0443\u0447\u0430\u0435\u043c \u0441\u0438\u043b\u044b, \u0434\u0435\u0439\u0441\u0442\u0432\u0443\u044e\u0449\u0438\u0435 \u043d\u0430 \u043e\u0431\u0435 \u0447\u0430\u0441\u0442\u0438\u0446\u044b \u0441\u043e \u0441\u0442\u043e\u0440\u043e\u043d\u044b \u0434\u0440\u0443\u0433 \u0434\u0440\u0443\u0433\u0430, \u043f\u0441\u0435\u0432\u0434\u043e\u043a\u043e\u0434:<\/p>\n<pre><code class=\"cpp\">U = 0; for (i = 0; i &lt; N; i++) \tfor (j = i + 1; j &lt; N-1; j++) \t{ \t\tdx = x[i] \u2013 x[j]; \t\tdy = y[i] \u2013 y[j]; \t\tdz = z[i] \u2013 z[j]; \t\tr = sqrt(dx*dx + dy*dy + dz*dz); \t\tU += pair_pot(r, types[i], types[j]); \t\tF = force(r, types[i], types[j]) \t\tfx[i] = F * dx; \t\tfx[j] = -F * dx; \t\tfy[i] = F * dy; \t\tfy[j] = -F * dy; \t\tfz[i] = F * dz; \t\tfz[j] = -F * dz;  \t} <\/code><\/pre>\n<p>  \u041a\u043e\u0434 \u043f\u0440\u043e\u0441\u0442\u0435\u0439\u0448\u0438\u0439: \u043d\u0430\u0445\u043e\u0434\u0438\u043c \u0440\u0430\u0441\u0441\u0442\u043e\u044f\u043d\u0438\u0435 \u043c\u0435\u0436\u0434\u0443 \u0447\u0430\u0441\u0442\u0438\u0446\u0430\u043c\u0438, \u043f\u043e\u0434\u0441\u0442\u0430\u0432\u043b\u044f\u0435\u043c \u0435\u0433\u043e \u0432 \u0444\u0443\u043d\u043a\u0446\u0438\u044e \u0434\u043b\u044f \u043f\u0430\u0440\u043d\u043e\u0433\u043e \u043f\u043e\u0442\u0435\u043d\u0446\u0438\u0430\u043b\u0430 \u0438 \u0432 \u0444\u0443\u043d\u043a\u0446\u0438\u044e \u0434\u043b\u044f \u0441\u0438\u043b\u044b (\u043e\u0431\u0435 \u0437\u0430\u0432\u0438\u0441\u044f\u0442 \u043e\u0442 \u0442\u0438\u043f\u043e\u0432 \u0432\u0437\u0430\u0438\u043c\u043e\u0434\u0435\u0439\u0441\u0442\u0432\u0443\u044e\u0449\u0438\u0445 \u0447\u0430\u0441\u0442\u0438\u0446) \u0438 \u0432\u044b\u0447\u0438\u0441\u043b\u044f\u0435\u043c \u043f\u0440\u043e\u0435\u043a\u0446\u0438\u0438 \u0441\u0438\u043b. \u0426\u0438\u043a\u043b \u0432\u044b\u043f\u043e\u043b\u043d\u044f\u0435\u0442\u0441\u044f N(N-1)\/2 \u0440\u0430\u0437, \u0433\u0434\u0435 N \u2013 \u0447\u0438\u0441\u043b\u043e \u0447\u0430\u0441\u0442\u0438\u0446. \u0427\u0442\u043e\u0431\u044b \u0445\u043e\u0442\u044c \u043a\u0430\u043a-\u0442\u043e \u0441\u043e\u043a\u0440\u0430\u0442\u0438\u0442\u044c \u0447\u0438\u0441\u043b\u043e \u0432\u044b\u0447\u0438\u0441\u043b\u0435\u043d\u0438\u0439 \u043c\u043e\u0436\u043d\u043e \u0432\u043e\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u044c\u0441\u044f \u0442\u0435\u043c, \u0447\u0442\u043e \u0432\u0435\u043b\u0438\u0447\u0438\u043d\u0430 \u0434\u0430\u043d\u043d\u044b\u0445 \u043f\u043e\u0442\u0435\u043d\u0446\u0438\u0430\u043b\u043e\u0432 \u0431\u044b\u0441\u0442\u0440\u043e \u0443\u0431\u044b\u0432\u0430\u0435\u0442 \u0441 \u0440\u0430\u0441\u0441\u0442\u043e\u044f\u043d\u0438\u0435\u043c. \u041d\u0430 \u0440\u0430\u0441\u0441\u0442\u043e\u044f\u043d\u0438\u044f\u0445 \u0431\u043e\u043b\u044c\u0448\u0435 6-8 \u0430\u043d\u0433\u0441\u0442\u0440\u0435\u043c, \u043f\u043e\u0442\u0435\u043d\u0446\u0438\u0430\u043b \u043c\u043e\u0436\u043d\u043e \u043d\u0435 \u0432\u044b\u0447\u0438\u0441\u043b\u044f\u0442\u044c, \u043e\u043d \u0431\u0443\u0434\u0435\u0442 \u043f\u043e\u0447\u0442\u0438 \u0440\u0430\u0432\u0435\u043d \u043d\u0443\u043b\u044e. \u0414\u043e\u0431\u0430\u0432\u0438\u0432 \u0443\u0441\u043b\u043e\u0432\u0438\u0435 \u043f\u0440\u043e\u0432\u0435\u0440\u043a\u0438 \u0440\u0430\u0441\u0441\u0442\u043e\u044f\u043d\u0438\u044f (\u0430 \u043b\u0443\u0447\u0448\u0435 \u0435\u0433\u043e \u043a\u0432\u0430\u0434\u0440\u0430\u0442\u0430) \u043c\u044b \u0441\u043e\u043a\u0440\u0430\u0442\u0438\u043c \u0447\u0438\u0441\u043b\u043e \u0432\u044b\u0447\u0438\u0441\u043b\u0435\u043d\u0438\u0439, \u043d\u043e \u043d\u0435 \u0441\u043e\u043a\u0440\u0430\u0442\u0438\u043c \u0447\u0438\u0441\u043b\u043e \u0438\u0442\u0435\u0440\u0430\u0446\u0438\u0439 \u0446\u0438\u043a\u043b\u0430. \u0414\u043b\u044f \u0431\u043e\u043b\u044c\u0448\u0438\u0445 \u0441\u0438\u0441\u0442\u0435\u043c \u0431\u043e\u043b\u044c\u0448\u0438\u043d\u0441\u0442\u0432\u043e \u043f\u0440\u043e\u0432\u0435\u0440\u043e\u043a \u0431\u0443\u0434\u0443\u0442 \u0434\u0430\u0432\u0430\u0442\u044c false. \u0421\u043b\u0435\u0434\u0443\u044e\u0449\u0438\u0435 \u0442\u0435\u0445\u043d\u0438\u043a\u0438 \u043f\u043e\u0437\u0432\u043e\u043b\u044f\u044e\u0442 \u0443\u043c\u0435\u043d\u044c\u0448\u0438\u0442\u044c \u0447\u0438\u0441\u043b\u043e \u043f\u0440\u043e\u0432\u0435\u0440\u043e\u043a \u0437\u0430 \u0441\u0447\u0435\u0442 \u043e\u0442\u0431\u0440\u043e\u0441\u0430 \u0447\u0430\u0441\u0442\u0438 \u043f\u0430\u0440 \u0441 \u0417\u0410\u0412\u0415\u0414\u041e\u041c\u041e \u0431\u043e\u043b\u044c\u0448\u0438\u043c \u043c\u0435\u0436\u0430\u0442\u043e\u043c\u043d\u044b\u043c \u0440\u0430\u0441\u0441\u0442\u043e\u044f\u043d\u0438\u0435\u043c.<\/p>\n<p>  \u0421\u0443\u0449\u0435\u0441\u0442\u0432\u0443\u044e\u0442 \u0434\u0432\u0430 \u043e\u0441\u043d\u043e\u0432\u043d\u044b\u0445 \u043c\u0435\u0442\u043e\u0434\u0430 \u0441\u043e\u043a\u0440\u0430\u0449\u0435\u043d\u0438\u044f \u0447\u0438\u0441\u043b\u0430 \u043f\u0435\u0440\u0435\u0431\u043e\u0440\u043e\u0432 \u043f\u0430\u0440 \u0447\u0430\u0441\u0442\u0438\u0446: c\u043f\u0438\u0441\u043e\u043a \u0441\u043e\u0441\u0435\u0434\u0435\u0439 (\u043e\u043d \u0436\u0435 <a href=\"https:\/\/doi.org\/10.1103\/PhysRev.159.98\">\u0441\u043f\u0438\u0441\u043e\u043a \u0412\u0435\u0440\u043b\u0435, Verlet list<\/a>) \u0438 <a href=\"https:\/\/en.wikipedia.org\/wiki\/Cell_lists\">\u0441\u043f\u0438\u0441\u043e\u043a \u044f\u0447\u0435\u0435\u043a<\/a> (cell list). \u0412 \u043f\u0435\u0440\u0432\u043e\u043c \u043c\u044b \u0434\u043b\u044f \u043a\u0430\u0436\u0434\u043e\u0439 \u0447\u0430\u0441\u0442\u0438\u0446\u044b \u0437\u0430\u043f\u043e\u043c\u0438\u043d\u0430\u0435\u043c \u0435\u0451 \u0441\u043e\u0441\u0435\u0434\u0435\u0439, \u043a\u043e\u0442\u043e\u0440\u044b\u0435 \u043d\u0430\u0445\u043e\u0434\u044f\u0442\u0441\u044f \u0432 \u0440\u0430\u0434\u0438\u0443\u0441\u0435 \u0434\u0435\u0439\u0441\u0442\u0432\u0438\u044f \u043f\u043e\u0442\u0435\u043d\u0446\u0438\u0430\u043b\u0430. \u0421\u043f\u0438\u0441\u043e\u043a \u0441\u043e\u0441\u0435\u0434\u0435\u0439 \u043d\u0435\u043e\u0431\u0445\u043e\u0434\u0438\u043c\u043e \u043e\u0431\u043d\u043e\u0432\u043b\u044f\u0442\u044c \u0441 \u043d\u0435\u043a\u043e\u0442\u043e\u0440\u043e\u0439, \u0437\u0430\u0440\u0430\u043d\u0435\u0435 \u043d\u0435\u0438\u0437\u0432\u0435\u0441\u0442\u043d\u043e\u0439, \u043f\u0435\u0440\u0438\u043e\u0434\u0438\u0447\u043d\u043e\u0441\u0442\u044c\u044e, \u0432 \u0447\u0435\u043c \u0438 \u0437\u0430\u043a\u043b\u044e\u0447\u0430\u0435\u0442\u0441\u044f \u043d\u0435\u0434\u043e\u0441\u0442\u0430\u0442\u043e\u043a \u043c\u0435\u0442\u043e\u0434\u0430. \u041f\u043e\u044d\u0442\u043e\u043c\u0443 \u043e\u0441\u0442\u0430\u043d\u043e\u0432\u0438\u043c\u0441\u044f \u043d\u0430 \u0441\u043f\u0438\u0441\u043a\u0435 \u044f\u0447\u0435\u0435\u043a, \u0441\u0443\u0442\u044c \u043a\u043e\u0442\u043e\u0440\u043e\u0433\u043e \u0437\u0430\u043a\u043b\u044e\u0447\u0430\u0435\u0442\u0441\u044f \u0432 \u0440\u0430\u0437\u0431\u0438\u0435\u043d\u0438\u0438 \u043c\u043e\u0434\u0435\u043b\u0438\u0440\u0443\u0435\u043c\u043e\u0433\u043e \u043e\u0431\u044a\u0451\u043c\u0430 (\u0431\u043e\u043a\u0441\u0430) \u043d\u0430 (\u0441\u0443\u0431)\u044f\u0447\u0435\u0439\u043a\u0438 (cell). \u041f\u0435\u0440\u0432\u043e\u043d\u0430\u0447\u0430\u043b\u044c\u043d\u043e, \u0440\u0430\u0437\u043c\u0435\u0440 \u044f\u0447\u0435\u0439\u043a\u0438 \u0432\u044b\u0431\u0438\u0440\u0430\u043b\u0438 \u0431\u043e\u043b\u044c\u0448\u0435 \u043b\u0438\u0431\u043e \u0440\u0430\u0432\u043d\u044b\u043c \u0440\u0430\u0434\u0438\u0443\u0441\u0443 \u043e\u0431\u0440\u0435\u0437\u0430\u043d\u0438\u044f. \u0422\u043e\u0433\u0434\u0430 \u0434\u043e\u0441\u0442\u0430\u0442\u043e\u0447\u043d\u043e \u043f\u0435\u0440\u0435\u0431\u0440\u0430\u0442\u044c \u043f\u0430\u0440\u044b \u0447\u0430\u0441\u0442\u0438\u0446 \u0432\u043d\u0443\u0442\u0440\u0438 \u043a\u0430\u0436\u0434\u043e\u0439 \u044f\u0447\u0435\u0439\u043a\u0438 \u0438 \u043c\u0435\u0436\u0434\u0443 \u0441\u043e\u0441\u0435\u0434\u043d\u0438\u043c\u0438 \u044f\u0447\u0435\u0439\u043a\u0430\u043c\u0438. \u0420\u0430\u0437\u043c\u0435\u0440 \u044f\u0447\u0435\u0439\u043a\u0438 \u043c\u043e\u0436\u0435\u0442 \u0431\u044b\u0442\u044c \u0438 \u0434\u0440\u0443\u0433\u0438\u043c, \u0433\u043b\u0430\u0432\u043d\u043e\u0435 \u043e\u043f\u0440\u0435\u0434\u0435\u043b\u0438\u0442\u044c \u043a\u0430\u043a\u0438\u0435 \u043f\u0430\u0440\u044b \u044f\u0447\u0435\u0435\u043a \u043d\u0430\u0434\u043e \u043f\u0440\u043e\u0432\u0435\u0440\u0438\u0442\u044c. \u0424\u0430\u043a\u0442\u0438\u0447\u0435\u0441\u043a\u0438 \u044d\u0442\u043e \u043f\u043e\u043f\u044b\u0442\u043a\u0430 \u043e\u043f\u0438\u0441\u0430\u0442\u044c \u0441\u0444\u0435\u0440\u0443 \u043a\u0443\u0431\u0438\u043a\u0430\u043c\u0438. \u0422\u0440\u0430\u0434\u0438\u0446\u0438\u043e\u043d\u043d\u043e, \u0434\u043b\u044f \u0440\u0435\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u0438 \u0441\u043f\u0438\u0441\u043a\u0430 \u044f\u0447\u0435\u0435\u043a \u0432 \u043f\u043e\u0441\u043b\u0435\u0434\u043e\u0432\u0430\u0442\u0435\u043b\u044c\u043d\u043e\u043c \u043a\u043e\u0434\u0435 \u0432\u0432\u043e\u0434\u044f\u0442\u0441\u044f \u0434\u0432\u0430 \u043c\u0430\u0441\u0441\u0438\u0432\u0430, <b>head <\/b>\u0438 <b>list<\/b>. \u0420\u0430\u0437\u043c\u0435\u0440 \u043f\u0435\u0440\u0432\u043e\u0433\u043e \u0440\u0430\u0432\u0435\u043d \u0447\u0438\u0441\u043b\u0443 \u044f\u0447\u0435\u0435\u043a, \u0432\u0442\u043e\u0440\u043e\u0433\u043e \u2013 \u0447\u0438\u0441\u043b\u0443 \u0447\u0430\u0441\u0442\u0438\u0446. \u0412 \u043f\u0435\u0440\u0432\u043e\u043c \u0445\u0440\u0430\u043d\u0438\u0442\u0441\u044f \u0438\u043d\u0434\u0435\u043a\u0441 \u043e\u0434\u043d\u043e\u0439 \u0438\u0437 \u0447\u0430\u0441\u0442\u0438\u0446 \u0432 \u0437\u0430\u0434\u0430\u043d\u043d\u043e\u0439 \u044f\u0447\u0435\u0439\u043a\u0435, \u0438\u043d\u0434\u0435\u043a\u0441\u044b \u0432\u0442\u043e\u0440\u043e\u0433\u043e \u0441\u043e\u043e\u0442\u0432\u0435\u0442\u0441\u0442\u0432\u0443\u044e\u0442 \u0438\u043d\u0434\u0435\u043a\u0441\u0430\u043c \u0447\u0430\u0441\u0442\u0438\u0446, \u0430 \u0441\u043e\u0434\u0435\u0440\u0436\u0438\u043c\u043e\u0435 \u2013 \u0438\u043d\u0434\u0435\u043a\u0441\u0443 \u0441\u043b\u0435\u0434\u0443\u044e\u0449\u0435\u0439 \u0447\u0430\u0441\u0442\u0438\u0446\u044b \u0432 \u044f\u0447\u0435\u0439\u043a\u0435 (-1, \u0435\u0441\u043b\u0438 \u0447\u0430\u0441\u0442\u0438\u0446 \u0432 \u044f\u0447\u0435\u0439\u043a\u0435 \u0431\u043e\u043b\u044c\u0448\u0435 \u043d\u0435\u0442), \u0438\u043b\u043b\u044e\u0441\u0442\u0440\u0430\u0446\u0438\u044f \u0434\u0430\u043d\u0430 \u043d\u0438\u0436\u0435.<\/p>\n<p>  <img decoding=\"async\" src=\"https:\/\/habrastorage.org\/webt\/tu\/bw\/hu\/tubwhuvbci2oc2uxlupu3nt4zsc.png\"\/><\/p>\n<p>  \u041f\u0441\u0435\u0432\u0434\u043e\u043a\u043e\u0434 \u043e\u0431\u0445\u043e\u0434\u0430 \u0442\u0430\u043a\u043e\u0433\u043e \u0441\u043f\u0438\u0441\u043a\u0430 \u0432\u043d\u0443\u0442\u0440\u0438 \u044f\u0447\u0435\u0439\u043a\u0438 \u0441 \u0438\u043d\u0434\u0435\u043a\u0441\u043e\u043c cell_index:<\/p>\n<pre><code class=\"cpp\">i = head[cell_index]; while (i &gt;= 0) {       j = list[i];       while (j &gt;= 0)       {            \u043e\u0431\u0440\u0430\u0431\u0430\u0442\u044b\u0432\u0430\u0435\u043c \u043f\u0430\u0440\u0443 \u0447\u0430\u0441\u0442\u0438\u0446 i-j;            j = list[j];       } i = list[i];  }\t <\/code><\/pre>\n<p>  \u0422\u0435\u043f\u0435\u0440\u044c \u043f\u043e\u043f\u0440\u043e\u0431\u0443\u0435\u043c \u0440\u0435\u0430\u043b\u0438\u0437\u043e\u0432\u0430\u0442\u044c \u0441\u043f\u0438\u0441\u043e\u043a \u044f\u0447\u0435\u0435\u043a \u043d\u0430 CUDA. \u0412 \u043d\u0443\u043b\u0435\u0432\u043e\u043c \u043f\u0440\u0438\u0431\u043b\u0438\u0436\u0435\u043d\u0438\u0438 \u043f\u0440\u043e\u0441\u0442\u043e \u0440\u0430\u0437\u0434\u0430\u0434\u0438\u043c \u043a\u0430\u0436\u0434\u043e\u043c\u0443 \u043f\u043e\u0442\u043e\u043a\u0443 \u0434\u0438\u0430\u043f\u0430\u0437\u043e\u043d \u044f\u0447\u0435\u0435\u043a, \u0432 \u043e\u0441\u0442\u0430\u043b\u044c\u043d\u043e\u043c \u043e\u0441\u0442\u0430\u0432\u0438\u0432 \u043f\u043e\u0441\u043b\u0435\u0434\u043e\u0432\u0430\u0442\u0435\u043b\u044c\u043d\u044b\u0439 \u043a\u043e\u0434 \u043f\u0435\u0440\u0435\u0431\u043e\u0440\u0430 \u043f\u0430\u0440 \u0447\u0430\u0441\u0442\u0438\u0446 \u0432\u043d\u0443\u0442\u0440\u0438 \u044f\u0447\u0435\u0439\u043a\u0438 \u0438 \u043f\u0430\u0440 \u0441 \u0443\u0447\u0430\u0441\u0442\u0438\u0435\u043c \u0447\u0430\u0441\u0442\u0438\u0446 \u0441\u043e\u0441\u0435\u0434\u043d\u0438\u0445 \u044f\u0447\u0435\u0435\u043a. \u0414\u043b\u044f \u043a\u0430\u0436\u0434\u043e\u0439 \u044f\u0447\u0435\u0439\u043a\u0438 \u0434\u043e\u043b\u0436\u0435\u043d \u0431\u044b\u0442\u044c \u043e\u043f\u0440\u0435\u0434\u0435\u043b\u0435\u043d \u043c\u0430\u0441\u0441\u0438\u0432 \u0441\u043e\u0441\u0435\u0434\u043d\u0438\u0445 \u044f\u0447\u0435\u0435\u043a <b>lstHNeig[iC][jC]<\/b> \u0438 \u0447\u0438\u0441\u043b\u043e \u044d\u0442\u0438\u0445 \u0441\u043e\u0441\u0435\u0434\u0435\u0439, \u043c\u0430\u0441\u0441\u0438\u0432 <b>nHeadNeig[]<\/b>: <\/p>\n<pre><code class=\"cpp\">__global__ void cell_list0(int cellPerBlock, int cellPerThread, cudaMD *md) {    int iC, jC;\t\/\/ \u0438\u043d\u0434\u0435\u043a\u0441\u044b \u044f\u0447\u0435\u0435\u043a    int i, j;\t\/\/ \u0438\u043d\u0434\u0435\u043a\u0441\u044b \u0447\u0430\u0441\u0442\u0438\u0446     int id0 = blockIdx.x * cellPerBlock + threadId.x * cellPerThread;    int N = min(id0 + cellPerThread, md-&gt;nCell);     \/\/ \u0446\u0438\u043a\u043b \u043f\u043e \u044f\u0447\u0435\u0439\u043a\u0430\u043c    for (iC = id0; iC &lt; N; iC++)    {       i = md-&gt;chead[iC];        while (i &gt;= 0)       {          \/\/ \u0446\u0438\u043a\u043b \u0432\u043d\u0443\u0442\u0440\u0438 \u043e\u0434\u043d\u043e\u0439 \u044f\u0447\u0435\u0439\u043a\u0438          j = md-&gt;clist[i]; \t          while (j &gt;= 0)          {             \u043e\u0431\u0440\u0430\u0431\u0430\u0442\u044b\u0432\u0430\u0435\u043c \u043f\u0430\u0440\u0443 \u0447\u0430\u0441\u0442\u0438\u0446 i-j;             j = md-&gt;clist[j];            }           \/\/ \u0446\u0438\u043a\u043b \u043f\u043e \u0441\u043e\u0441\u0435\u0434\u044f\u043c \u044f\u0447\u0435\u0439\u043a\u0438          for (jC = 0; jC &lt; md-&gt;nHeadNeig[iC]; jC++)          {             j = md-&gt;chead[md-&gt;lstHNeig[iC][jC]];             while (j &gt;= 0)             {                \u043e\u0431\u0440\u0430\u0431\u0430\u0442\u044b\u0432\u0430\u0435\u043c \u043f\u0430\u0440\u0443 \u0447\u0430\u0441\u0442\u0438\u0446 i-j;                    j = md-&gt;clist[j];             }          }          i = md-&gt;clist[i];       }     } } <\/code><\/pre>\n<p>  \u041d\u0430 \u043c\u043e\u0439 \u0432\u0437\u0433\u043b\u044f\u0434, \u0442\u0430\u043a\u0430\u044f \u0440\u0435\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u044f \u043d\u0435 \u0440\u0430\u0441\u043a\u0440\u044b\u0432\u0430\u0435\u0442 \u043f\u043e\u043b\u043d\u043e\u0441\u0442\u044c\u044e \u043f\u043e\u0442\u0435\u043d\u0446\u0438\u0430\u043b \u0432\u0438\u0434\u0435\u043e\u043a\u0430\u0440\u0442\u044b, \u043f\u043e\u0441\u043a\u043e\u043b\u044c\u043a\u0443 \u043e\u0434\u0438\u043d \u043f\u043e\u0442\u043e\u043a \u043e\u0431\u0440\u0430\u0431\u0430\u0442\u044b\u0432\u0430\u0435\u0442 \u043e\u0434\u043d\u0443 \u044f\u0447\u0435\u0439\u043a\u0443, \u043a\u043e\u0442\u043e\u0440\u044b\u0445 \u043a\u0430\u043a \u043f\u0440\u0430\u0432\u0438\u043b\u043e \u0441\u0443\u0449\u0435\u0441\u0442\u0432\u0435\u043d\u043d\u043e \u043c\u0435\u043d\u044c\u0448\u0435 \u0447\u0438\u0441\u043b\u0430 \u0447\u0430\u0441\u0442\u0438\u0446. \u0412\u043e-\u0432\u0442\u043e\u0440\u044b\u0445, \u0432\u043d\u0443\u0442\u0440\u0438 \u0444\u0443\u043d\u043a\u0446\u0438\u0438 \u043e\u0431\u0440\u0430\u0431\u043e\u0442\u043a\u0438 \u043f\u0430\u0440\u044b \u0447\u0430\u0441\u0442\u0438\u0446 \u0432\u043e\u0437\u043c\u043e\u0436\u043d\u0430 \u0440\u0430\u0431\u043e\u0442\u0430 \u0442\u043e\u043b\u044c\u043a\u043e \u0447\u0435\u0440\u0435\u0437 atomic \u043e\u043f\u0435\u0440\u0430\u0446\u0438\u0438. \u041f\u043e\u043f\u0440\u043e\u0431\u0443\u0435\u043c \u0441\u0438\u043b\u044c\u043d\u0435\u0435 \u0440\u0430\u0441\u043f\u0430\u0440\u0430\u043b\u043b\u0435\u043b\u0438\u0442\u044c \u0437\u0430\u0434\u0430\u0447\u0443, \u043f\u0443\u0441\u0442\u044c \u043a\u0430\u0436\u0434\u044b\u0439 \u043f\u043e\u0442\u043e\u043a \u043e\u0431\u0440\u0430\u0431\u0430\u0442\u044b\u0432\u0430\u0435\u0442 \u043f\u0430\u0440\u0443 \u0441\u043e\u0441\u0435\u0434\u043d\u0438\u0445 \u044f\u0447\u0435\u0435\u043a (\u0441\u0447\u0438\u0442\u0430\u0435\u043c, \u0447\u0442\u043e \u0441\u043f\u0438\u0441\u043e\u043a \u0442\u0430\u043a\u0438\u0445 \u043f\u0430\u0440 \u0443\u0436\u0435 \u0441\u043e\u0437\u0434\u0430\u043d):<\/p>\n<pre><code class=\"cpp\">__global__ void cell_list1(int pairPerBlock, int pairPerThread, cudaMD *md) {    int iP, iC, jC;\t\/\/ \u0438\u043d\u0434\u0435\u043a\u0441\u044b \u043f\u0430\u0440\u044b \u044f\u0447\u0435\u0435\u043a \u0438 \u044f\u0447\u0435\u0435\u043a    int i, j;\t\t\/\/ \u0438\u043d\u0434\u0435\u043a\u0441\u044b \u0447\u0430\u0441\u0442\u0438\u0446     int id0 = blockIdx.x * pairPerBlock + threadId.x * pairPerThread;    int N = min(id0 + cellPerThread, md-&gt;nCell);     for (iP = id0; iC &lt; N; iP++)    {       iC = md-&gt;cellPairs[iP].x;       jC = md-&gt;cellPairs[iP].y;       i = md-&gt;chead[iC];        while (i &gt;= 0)       {          j = md-&gt;chead[jC];          while (j &gt;= 0)          {              \u043e\u0431\u0440\u0430\u0431\u0430\u0442\u044b\u0432\u0430\u0435\u043c \u043f\u0430\u0440\u0443 \u0447\u0430\u0441\u0442\u0438\u0446 i-j;              j = md-&gt;clist[j];          }          i = md-&gt;clist[i];       }     } }  <\/code><\/pre>\n<p>  \u041c\u0430\u0441\u0441\u0438\u0432 <b>cellPairs[]<\/b> \u0441\u043e\u0434\u0435\u0440\u0436\u0438\u0442 \u043a\u043e\u043b\u0438\u0447\u0435\u0441\u0442\u0432\u043e \u043f\u0430\u0440 \u0441\u043e\u0441\u0435\u0434\u043d\u0438\u0445 \u044f\u0447\u0435\u0435\u043a (.x \u2013 \u043f\u0435\u0440\u0432\u0430\u044f \u044f\u0447\u0435\u0439\u043a\u0430 \u043f\u0430\u0440\u044b, .y \u2013 \u0432\u0442\u043e\u0440\u0430\u044f). \u041a\u043e\u0434 \u043f\u0440\u043e\u0449\u0435 \u0438 \u0438\u0437\u044f\u0449\u043d\u0435\u0435, \u043d\u043e \u0437\u0434\u0435\u0441\u044c \u043f\u0440\u043e\u043f\u0430\u0434\u0430\u0435\u0442 \u043e\u0431\u0440\u0430\u0431\u043e\u0442\u043a\u0430 \u043f\u0430\u0440 \u0447\u0430\u0441\u0442\u0438\u0446 \u0432\u043d\u0443\u0442\u0440\u0438 \u043e\u0434\u043d\u043e\u0439 \u044f\u0447\u0435\u0439\u043a\u0438, \u0434\u043b\u044f \u0447\u0435\u0433\u043e \u0434\u043e\u043b\u0436\u043d\u0430 \u0431\u044b\u0442\u044c \u043d\u0430\u043f\u0438\u0441\u0430\u043d\u0430 \u043e\u0442\u0434\u0435\u043b\u044c\u043d\u0430\u044f \u0444\u0443\u043d\u043a\u0446\u0438\u044f. \u0415\u0441\u0442\u044c \u0435\u0449\u0451 \u043e\u0434\u043d\u0430 \u043f\u0440\u043e\u0431\u043b\u0435\u043c\u0430, \u043e\u0440\u0433\u0430\u043d\u0438\u0437\u0430\u0446\u0438\u044f \u0441\u043f\u0438\u0441\u043a\u0430 \u044f\u0447\u0435\u0435\u043a \u0438 \u0435\u0433\u043e \u043e\u0431\u0445\u043e\u0434 \u043d\u0435\u044d\u0444\u0444\u0435\u043a\u0442\u0438\u0432\u043d\u044b \u0434\u043b\u044f \u043f\u0430\u0440\u0430\u043b\u043b\u0435\u043b\u044c\u043d\u044b\u0445 \u0432\u044b\u0447\u0438\u0441\u043b\u0435\u043d\u0438\u0439, \u043f\u043e\u0441\u043a\u043e\u043b\u044c\u043a\u0443 \u0447\u0442\u043e\u0431\u044b \u043f\u043e\u043b\u0443\u0447\u0438\u0442\u044c \u0438\u043d\u0434\u0435\u043a\u0441 \u0441\u043b\u0435\u0434\u0443\u044e\u0449\u0435\u0439 \u0447\u0430\u0441\u0442\u0438\u0446\u044b \u0432 \u044f\u0447\u0435\u0439\u043a\u0435 \u043d\u0443\u0436\u043d\u043e \u043f\u0440\u043e\u0431\u0435\u0436\u0430\u0442\u044c \u043f\u043e \u0432\u0441\u0435\u043c \u043f\u0440\u0435\u0434\u044b\u0434\u0443\u0449\u0438\u043c. \u041f\u043e\u043f\u0440\u043e\u0431\u0443\u0435\u043c \u0441\u043e\u0437\u0434\u0430\u0442\u044c \u0431\u043e\u043b\u0435\u0435 \u044d\u0444\u0444\u0435\u043a\u0442\u0438\u0432\u043d\u044b\u0439 \u043a\u043e\u0434 \u0438 \u0441\u0442\u0440\u0443\u043a\u0442\u0443\u0440\u0443 \u0434\u0430\u043d\u043d\u044b\u0445, \u0447\u0442\u043e\u0431\u044b \u043f\u0430\u0440\u0443 \u044f\u0447\u0435\u0435\u043a \u043c\u043e\u0433\u043b\u0438 \u043e\u0431\u0440\u0430\u0431\u0430\u0442\u044b\u0432\u0430\u0442\u044c \u0441\u0440\u0430\u0437\u0443 \u043d\u0435\u0441\u043a\u043e\u043b\u044c\u043a\u043e \u043f\u043e\u0442\u043e\u043a\u043e\u0432. \u041f\u0443\u0441\u0442\u044c \u0442\u0435\u043f\u0435\u0440\u044c \u0441\u043f\u0438\u0441\u043e\u043a \u044f\u0447\u0435\u0435\u043a \u0431\u0443\u0434\u0435\u0442 \u0445\u0440\u0430\u043d\u0438\u0442\u0441\u044f \u0432 \u0434\u0432\u0443\u043c\u0435\u0440\u043d\u043e\u043c \u043c\u0430\u0441\u0441\u0438\u0432\u0435 <b>cell[][]<\/b>, \u0433\u0434\u0435 \u043f\u0435\u0440\u0432\u044b\u0439 \u0438\u043d\u0434\u0435\u043a\u0441 \u043e\u043f\u0440\u0435\u0434\u0435\u043b\u044f\u0435\u0442 \u043d\u043e\u043c\u0435\u0440 \u044f\u0447\u0435\u0439\u043a\u0438, \u0430 \u0432\u0442\u043e\u0440\u043e\u0439 \u2013 \u043f\u043e\u0440\u044f\u0434\u043a\u043e\u0432\u044b\u0439 \u043d\u043e\u043c\u0435\u0440 \u0430\u0442\u043e\u043c\u0430 \u0432\u043d\u0443\u0442\u0440\u0438 \u044f\u0447\u0435\u0439\u043a\u0438. \u0422\u0430\u043a\u0436\u0435 \u044f \u0445\u0440\u0430\u043d\u044e \u0447\u0438\u0441\u043b\u043e \u0447\u0430\u0441\u0442\u0438\u0446 \u0432 \u044f\u0447\u0435\u0439\u043a\u0435 \u0432 \u043d\u0443\u043b\u0435\u0432\u043e\u043c \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u0435 \u043c\u0430\u0441\u0441\u0438\u0432\u0430: <b>cell[i][0]<\/b>, \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u0435 <b>cell[i][j+1]<\/b> \u0440\u0430\u0432\u043d\u043e \u043e\u0431\u0449\u0435\u043c\u0443 \u0438\u043d\u0434\u0435\u043a\u0441\u0443 \u0447\u0430\u0441\u0442\u0438\u0446\u044b \u0432 global memory. \u041f\u0440\u0430\u0432\u0434\u0430 \u0442\u0430\u043a\u0430\u044f \u0440\u0435\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u044f \u0442\u0440\u0435\u0431\u0443\u0435\u0442\u0441\u044f \u0437\u043d\u0430\u0442\u044c \u043c\u0430\u043a\u0441\u0438\u043c\u0430\u043b\u044c\u043d\u043e\u0435 \u043a\u043e\u043b\u0438\u0447\u0435\u0441\u0442\u0432\u043e \u0447\u0430\u0441\u0442\u0438\u0446 \u0432 \u044f\u0447\u0435\u0439\u043a\u0435 \u0438 \u0431\u0443\u0434\u0435\u0442 \u0437\u0430\u043d\u0438\u043c\u0430\u0442\u044c \u0431\u043e\u043b\u044c\u0448\u0435 \u043f\u0430\u043c\u044f\u0442\u0438. \u0422\u0430\u043a\u0436\u0435 \u0440\u0430\u0437\u043e\u0431\u044c\u0451\u043c \u043d\u0430\u0448\u0443 \u0437\u0430\u0434\u0430\u0447\u0443 \u043d\u0430 2 \u043f\u043e\u0434\u0437\u0430\u0434\u0430\u0447\u0438. \u041f\u0435\u0440\u0432\u0430\u044f \u0444\u0443\u043d\u043a\u0446\u0438\u044f \u0431\u0443\u0434\u0435\u0442 \u0432\u044b\u0447\u0438\u0441\u043b\u044f\u0442\u044c \u0432\u0437\u0430\u0438\u043c\u043e\u0434\u0435\u0439\u0441\u0442\u0432\u0438\u0435 \u0432 \u043d\u0435\u043f\u0435\u0440\u0435\u0441\u0435\u043a\u0430\u044e\u0449\u0438\u0445\u0441\u044f \u043f\u0430\u0440\u0430\u0445 \u044f\u0447\u0435\u0435\u043a (\u043d\u0430\u043f\u0440\u0438\u043c\u0435\u0440, \u0441 \u0438\u043d\u0434\u0435\u043a\u0441\u0430\u043c\u0438 0-1, 2-3, 4-5 \u0438 \u0442.\u0434.) \u0438 \u0432\u043d\u0443\u0442\u0440\u0438 \u044f\u0447\u0435\u0435\u043a:<\/p>\n<pre><code class=\"cpp\">__global__ void cell_list2a(cudaMD *md) {    int iP, iC, iCA, iCB, step, step1;     int i, j, id0, id1, N, N1, deltId;    int id;    int nA, nB, nOwn;      int ex = 0;\t\t\/\/\u0444\u043b\u0430\u0433 \u0432\u044b\u0445\u043e\u0434\u0430 \u0438\u0437 \u0446\u0438\u043a\u043b\u0430     \/\/ \u043d\u0430\u043a\u043e\u043f\u0438\u0442\u0435\u043b\u0438 \u0412\u0430\u043d-\u0434\u0435\u0440-\u0412\u0430\u0430\u043b\u044c\u0441\u043e\u0432\u043e\u0439 \u0438 \u041a\u0443\u043b\u043e\u043d\u043e\u0432\u0441\u043a\u043e\u0439 \u044d\u043d\u0435\u0440\u0433\u0438\u0439 \u0432\u043d\u0443\u0442\u0440\u0438 \u043f\u043e\u0442\u043e\u043a\u0430 \u0438 \u0432 \u0431\u043b\u043e\u043a\u0435    __shared__ float engVdW, engCoul;    float eVdW = 0.0;    float eCoul = 0.0;  \/\/ \u0434\u0438\u043d\u0430\u043c\u0438\u0447\u0435\u0441\u043a\u0438 \u0432\u044b\u0434\u0435\u043b\u0435\u043d\u043d\u0430\u044f shared \u043f\u0430\u043c\u044f\u0442\u044c   extern __shared__ int shMem[];         int* sAids = shMem;\t\t\/\/ \u043d\u043e\u043c\u0435\u0440\u0430 \u0447\u0430\u0441\u0442\u0438\u0446 \u0432 \u044f\u0447\u0435\u0439\u043a\u0435 1 (\u0442\u0443\u0442 \u043e\u043d\u0430 \u043e\u0431\u043e\u0437\u043d\u0430\u0447\u0435\u043d\u0430 \u0410)   int* sAtypes = (int*)&sAids[md-&gt;maxAtPerCell]; \/\/ \u0442\u0438\u043f\u044b \u0447\u0430\u0441\u0442\u0438\u0446 \u0432 \u044f\u0447\u0435\u0439\u043a\u0435 \u0410   float3* sAxyz = (float3*)&sAtypes[md-&gt;maxAtPerCell]; \/\/ \u043a\u043e\u043e\u0440\u0434\u0438\u043d\u0430\u0442\u044b \u0447\u0430\u0441\u0442\u0438\u0446 \u0432 \u044f\u0447\u0435\u0439\u043a\u0435 \u0410   float3* sAfrs = (float3*)&sAxyz[md-&gt;maxAtPerCell]; \/\/ \u0441\u0438\u043b\u044b \u043d\u0430 \u0447\u0430\u0441\u0442\u0438\u0446\u0435 \u0432 \u044f\u0447\u0435\u0439\u043a\u0435 \u0410    \/\/ \u0430\u043d\u0430\u043b\u043e\u0433\u0438\u0447\u043d\u044b\u0435 \u043c\u0430\u0441\u0441\u0438\u0432\u044b \u0434\u043b\u044f \u044f\u0447\u0435\u0439\u043a\u0438 2 (B)   int* sBids = (int*)&sAfrs[md-&gt;maxAtPerCell];   int* sBtypes = (int*)&sBids[md-&gt;maxAtPerCell];   float3* sBxyz = (float3*)&sBtypes[md-&gt;maxAtPerCell];   float3* sBfrs = (float3*)&sBxyz[md-&gt;maxAtPerCell];     \/\/ \u0443\u043a\u0430\u0437\u0430\u0442\u0435\u043b\u0438 \u043d\u0430 \u043c\u0430\u0441\u0441\u0438\u0432\u044b, \u043a\u043e\u0442\u043e\u0440\u044b\u0435 \u043e\u0431\u0440\u0430\u0431\u0430\u0442\u044b\u0432\u0430\u0435\u0442 \u0434\u0430\u043d\u043d\u044b\u0439 \u043f\u043e\u0442\u043e\u043a    float3 *sXyz;    float3 *sFrs;    int *sTypes;    int *sIds;     \/\/ \u0431\u0435\u0440\u0435\u043c \u0438\u043d\u0434\u0435\u043a\u0441\u044b \u043f\u0430\u0440 \u044f\u0447\u0435\u0435\u043a \u0432 \u0434\u0430\u043d\u043d\u043e\u0439 \u043f\u0430\u0440\u0435    iCA = md-&gt;cellPairs[blockIdx.x].x;  \/\/ \u0438\u043d\u0434\u0435\u043a\u0441 \u044f\u0447\u0435\u0439\u043a\u0438 \u0410    iCB = md-&gt;cellPairs[blockIdx.x].y;  \/\/ \u0438\u043d\u0434\u0435\u043a\u0441 \u044f\u0447\u0435\u0439\u043a\u0438 B     \/\/ \u043e\u0431\u043d\u0443\u043b\u044f\u0435\u043c \u041a\u0443\u043b\u043e\u043d\u043e\u0432\u0441\u043a\u0443\u044e \u0438 \u0412\u0430\u043d-\u0434\u0435\u0440-\u0412\u0430\u0430\u043b\u044c\u0441\u043e\u0432\u0443 \u044d\u043d\u0435\u0440\u0433\u0438\u0438   if (threadIdx.x == 0)     {         engVdW = 0.0;         engCoul = 0.0;     }     \/\/ \u0441\u043f\u0435\u0440\u0432\u0430 \u043f\u043e\u0442\u043e\u043a\u0438 \u043a\u043e\u043f\u0438\u0440\u0443\u044e\u0442 \u0434\u0430\u043d\u043d\u044b\u0435 \u0432 shared_memory    if (threadIdx.x &lt; blockDim.x \/ 2) \/\/! \u043f\u043e\u043b\u043e\u0432\u0438\u043d\u0430 \u043f\u043e\u0442\u043e\u043a\u043e\u0432 \u0431\u0443\u0434\u0435\u0442 \u043a\u043e\u043f\u0438\u0440\u043e\u0432\u0430\u0442\u044c \u0432 \u044f\u0447\u0435\u0439\u043a\u0443 A, \u043f\u043e\u043b\u043e\u0432\u0438\u043d\u0430 - \u0432 \u044f\u0447\u0435\u0439\u043a\u0443 B. \u041d\u0430\u0434\u043e, \u0447\u0442\u043e\u0431\u044b \u0440\u0430\u0437\u043c\u0435\u0440 \u0431\u043b\u043e\u043a\u0430 \u0431\u044b\u043b \u0447\u0435\u0442\u043d\u044b\u043c      {         iC = iCA;         sXyz = sAxyz;         sFrs = sAfrs;         sTypes = sAtypes;         sIds = sAids;         deltId = 0;      }    else      {         iC = iCB;         sXyz = sBxyz;         sFrs = sBfrs;         sTypes = sBtypes;         sIds = sBids;         deltId = blockDim.x \/ 2;      }     \/\/ \u0432 \u043f\u0435\u0440\u0432\u043e\u043c \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u0435 \u043c\u0430\u0441\u0441\u0438\u0432\u0430 \u0445\u0440\u0430\u043d\u0438\u0442\u0441\u044f \u0447\u0438\u0441\u043b\u043e \u0447\u0430\u0441\u0442\u0438\u0446     nA = md-&gt;cells[iCA][0];    nB = md-&gt;cells[iCB][0];    nOwn = md-&gt;cells[iC][0]; \/\/ nA \u0438\u043b\u0438 nB     \/\/ \u043e\u043f\u0440\u0435\u0434\u0435\u043b\u044f\u0435\u043c \u0434\u0438\u0430\u043f\u0430\u0437\u043e\u043d \u0447\u0430\u0441\u0442\u0438\u0446, \u043a\u043e\u0442\u043e\u0440\u044b\u0435 \u0431\u0443\u0434\u0435\u0442 \u0441\u0447\u0438\u0442\u044b\u0432\u0430\u0442\u044c \u0434\u0430\u043d\u043d\u044b\u0439 \u043f\u043e\u0442\u043e\u043a   step = ceilf(2 * (double)nOwn \/ (double)blockDim.x);    id0 = (threadIdx.x - deltId) * step;    N = min(id0 + step, nOwn);    for (i = id0; i &lt; N; i++)    {       id = md-&gt;cells[iC][i+1];       sIds[i] = id;\t\t\/\/ \u0441\u043e\u0445\u0440\u0430\u043d\u044f\u0435\u043c \u0438\u043d\u0434\u0435\u043a\u0441\u044b \u0447\u0430\u0441\u0442\u0438\u0446       sXyz[i] = md-&gt;xyz[id];\t\/\/ \u043a\u043e\u043f\u0438\u0440\u0443\u0435\u043c \u043a\u043e\u043e\u0440\u0434\u0438\u043d\u0430\u0442\u044b       sFrs[i] = make_float3(0.0, 0.0, 0.0);    \/\/ \u043e\u0431\u043d\u0443\u043b\u044f\u0435\u043c \u0441\u0438\u043b\u044b    sTypes[i] = md-&gt;types[id];    }    __syncthreads();     \/\/ \u0432\u0437\u0430\u0438\u043c\u043e\u0434\u0435\u0439\u0441\u0442\u0432\u0438\u0435 \u043c\u0435\u0436\u0434\u0443 \u0447\u0430\u0441\u0442\u0438\u0446\u0430\u043c\u0438 \u0432\u043d\u0443\u0442\u0440\u0438 \u043e\u0434\u043d\u043e\u0439 \u044f\u0447\u0435\u0439\u043a\u0438    \/\/ \u043f\u043e\u0442\u043e\u043a\u0438 \u043e\u0431\u0440\u0430\u0431\u0430\u0442\u044b\u0432\u0430\u044e\u0442 \u043f\u0430\u0440\u044b \u0447\u0430\u0441\u0442\u0438\u0446 \u043d\u0430\u0447\u0438\u043d\u0430\u044f \u0441 \u0438\u043d\u0434\u0435\u043a\u0441\u043e\u0432 i=0 \u0438 j=1, \u0441 \u0448\u0430\u0433\u043e\u043c \u043f\u043e j \u0440\u0430\u0432\u043d\u044b\u043c \u0447\u0438\u0441\u043b\u0443 \u043f\u043e\u0442\u043e\u043a\u043e\u0432 \u0432 \u0431\u043b\u043e\u043a\u0435    i = 0;    j = threadIdx.x \u2013 deltId + 1;    step1 = blockDim.x \/ 2;    while (1)    {       while (j &gt;= nOwn)       {           i++;           if (i &gt;= nOwn-1)           {               ex = 1;               break;           }           j = i + 1 + j - nOwn;       }       if (ex) break;       pair_in_cell(sXyz[i], @sFrs[i], sTypes[i], sXyz[j], @sFrs[j], sTypes[j], md, eVdW, eCoul);       j = j + step1;    }     \/\/ \u0432\u044b\u0447\u0438\u0441\u043b\u044f\u0435\u043c \u0432\u0437\u0430\u0438\u043c\u043e\u0434\u0435\u0439\u0441\u0442\u0432\u0438\u044f \u043c\u0435\u0436\u0434\u0443 \u0447\u0430\u0441\u0442\u0438\u0446\u0430\u043c\u0438 \u0432 \u0440\u0430\u0437\u043d\u044b\u0445 \u044f\u0447\u0435\u0439\u043a\u0430\u0445    step1 = ceilf(nA \/ blockDim.x);    id1 = threadIdx.x * step1;    N1 = min(id1 + step1, nA);    for (i = id1; i &lt; N1; i++)      for (j = 0; j &lt; nB; j++)        pair_between_cell(sAxyz[i], &sAfrs[i], sAtypes[i], sBxyz[j], &sBfrs[j], sBtypes[j], md-&gt;cellShifts[blockId.x], md, eVdW, eCoul);     __syncthreads();     \/\/ \u043a\u043e\u043f\u0438\u0440\u0443\u0435\u043c \u0432\u044b\u0447\u0438\u0441\u043b\u0435\u043d\u043d\u044b\u0435 \u0441\u0438\u043b\u044b \u0432 global memory    for (i = id0; i &lt; N; i++)        md-&gt;frs[sIds[i]] = sFrs[i];     \/\/ \u0441\u0443\u043c\u043c\u0438\u0440\u0443\u0435\u043c \u044d\u043d\u0435\u0440\u0433\u0438\u0438 \u0432\u043d\u0443\u0442\u0440\u0438 \u043e\u0434\u043d\u043e\u0433\u043e \u0431\u043b\u043e\u043a\u0430    atomicAdd(&engCoul, eCoul);    atomicAdd(&engVdw, eVdW);    __syncthreads();     \/\/ \u0441\u0443\u043c\u043c\u0438\u0440\u0443\u0435\u043c \u044d\u043d\u0435\u0440\u0433\u0438\u0438 \u0431\u043b\u043e\u043a\u0430 \u0432 global memory    if (!threadIdx.x)     {       atomicAdd(&md-&gt;engCoul, engCoul);         atomicAdd(&md-&gt;engVdW, engVdW);    } }  <\/code><\/pre>\n<p>  \u041f\u0435\u0440\u0435\u043c\u0435\u043d\u043d\u044b\u0435 \u0432\u0438\u0434\u0430 <b>float3PerCell <\/b>\u2013 \u044d\u0442\u043e \u043f\u0440\u043e\u0438\u0437\u0432\u0435\u0434\u0435\u043d\u0438\u0435 \u043c\u0430\u043a\u0441\u0438\u043c\u0430\u043b\u044c\u043d\u043e\u0433\u043e \u0447\u0438\u0441\u043b\u0430 \u0447\u0430\u0441\u0442\u0438\u0446 \u0432 \u044f\u0447\u0435\u0439\u043a\u0435 \u043d\u0430 \u0440\u0430\u0437\u043c\u0435\u0440 \u0442\u0438\u043f\u0430 float3. \u0418\u043c\u0435\u0435\u0442 \u0441\u043c\u044b\u0441\u043b \u043e\u0434\u0438\u043d \u0440\u0430\u0437 \u0432\u044b\u0447\u0438\u0441\u043b\u0438\u0442\u044c \u0438\u0445 \u043f\u0440\u0438 \u0438\u043d\u0438\u0446\u0438\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u0438 \u0441\u0438\u0441\u0442\u0435\u043c\u044b. \u0424\u0443\u043d\u043a\u0446\u0438\u0438<i> pair_in_cell<\/i> \u0438 <i>pair_between_cell<\/i> \u0432\u044b\u0447\u0438\u0441\u043b\u044f\u044e\u0442 \u0432\u0437\u0430\u0438\u043c\u043e\u0434\u0435\u0439\u0441\u0442\u0432\u0438\u044f \u043c\u0435\u0436\u0434\u0443 \u0447\u0430\u0441\u0442\u0438\u0446\u0430\u043c\u0438 \u0432 \u043e\u0434\u043d\u043e\u0439 \u0438 \u0440\u0430\u0437\u043d\u044b\u0445 \u044f\u0447\u0435\u0439\u043a\u0430\u0445, \u0441\u043e\u043e\u0442\u0432\u0435\u0442\u0441\u0442\u0432\u0435\u043d\u043d\u043e. \u0412 \u043a\u0430\u0447\u0435\u0441\u0442\u0432\u0435 \u043f\u0430\u0440\u0430\u043c\u0435\u0442\u0440\u043e\u0432 \u043e\u043d\u0438 \u043f\u043e\u043b\u0443\u0447\u0430\u044e\u0442 \u043a\u043e\u043e\u0440\u0434\u0438\u043d\u0430\u0442\u044b \u0447\u0430\u0441\u0442\u0438\u0446, \u0438\u0445 \u0442\u0438\u043f\u044b \u0438 \u0443\u043a\u0430\u0437\u0430\u0442\u0435\u043b\u0438 \u043a\u0443\u0434\u0430 \u0437\u0430\u043f\u0438\u0441\u044b\u0432\u0430\u0442\u044c \u0441\u0438\u043b\u044b. \u041f\u0430\u0440\u0430\u043c\u0435\u0442\u0440\u044b \u0434\u043b\u044f <i>pair_between_cell<\/i> \u0432\u043a\u043b\u044e\u0447\u0430\u044e\u0442 \u0442\u0430\u043a\u0436\u0435 \u0432\u0435\u043b\u0438\u0447\u0438\u043d\u044b \u0441\u0434\u0432\u0438\u0433\u043e\u0432, \u0434\u043b\u044f \u0443\u0447\u0435\u0442\u0430 \u043f\u0435\u0440\u0438\u043e\u0434\u0438\u0447\u0435\u0441\u043a\u0438\u0445 \u0433\u0440\u0430\u043d\u0438\u0447\u043d\u044b\u0445 \u0443\u0441\u043b\u043e\u0432\u0438\u0439. \u041a\u043e\u0434\u044b \u0434\u043b\u044f \u044d\u0442\u0438\u0445 \u0444\u0443\u043d\u043a\u0446\u0438\u0439 \u0431\u0443\u0434\u0443\u0442 \u043f\u0440\u0438\u0432\u0435\u0434\u0435\u043d\u044b \u0447\u0443\u0442\u044c \u043d\u0438\u0436\u0435. \u0414\u043b\u044f \u043f\u0435\u0440\u0435\u0431\u043e\u0440\u0430 \u043f\u0430\u0440 \u0447\u0430\u0441\u0442\u0438\u0446 \u0432\u043d\u0443\u0442\u0440\u0438 \u044f\u0447\u0435\u0439\u043a\u0438 \u044f \u0445\u043e\u0442\u0435\u043b \u043f\u043e\u0439\u0442\u0438 \u0441\u0442\u0430\u043d\u0434\u0430\u0440\u0442\u043d\u044b\u043c \u043f\u0443\u0442\u0435\u043c \u2013 \u0440\u0430\u0437\u0431\u0438\u0442\u044c \u043a\u043e\u043b\u0438\u0447\u0435\u0441\u0442\u0432\u043e \u043f\u0430\u0440 \u043d\u0430 \u0440\u0430\u0432\u043d\u044b\u0435 \u0438\u043d\u0442\u0435\u0440\u0432\u0430\u043b\u044b \u0438 \u0432\u044b\u0434\u0430\u0442\u044c \u043a\u0430\u0436\u0434\u043e\u043c\u0443 \u043f\u043e\u0442\u043e\u043a\u0443 \u043f\u043e \u0438\u043d\u0442\u0435\u0440\u0432\u0430\u043b\u0443. \u041e\u0434\u043d\u0430\u043a\u043e, \u0447\u0442\u043e\u0431\u044b \u043f\u043e\u043b\u0443\u0447\u0438\u0442\u044c \u0438\u043d\u0434\u0435\u043a\u0441\u044b \u0447\u0430\u0441\u0442\u0438\u0446 i-j \u043f\u043e \u043d\u043e\u043c\u0435\u0440\u0443 \u043f\u0430\u0440\u044b \u044f \u043f\u0440\u0438\u0448\u0435\u043b \u043a \u043a\u0432\u0430\u0434\u0440\u0430\u0442\u043d\u043e\u043c\u0443 \u0443\u0440\u0430\u0432\u043d\u0435\u043d\u0438\u044e \u0438 \u0440\u0435\u0448\u0438\u043b \u0441\u0434\u0435\u043b\u0430\u0442\u044c \u043f\u043e-\u0434\u0440\u0443\u0433\u043e\u043c\u0443: \u043f\u0435\u0440\u0432\u044b\u0439 \u043f\u043e\u0442\u043e\u043a \u043e\u0431\u0440\u0430\u0431\u0430\u0442\u044b\u0432\u0430\u0435\u0442 \u043f\u0430\u0440\u0443 \u0447\u0430\u0441\u0442\u0438\u0446 \u0441 \u0438\u043d\u0434\u0435\u043a\u0441\u0430\u043c\u0438 0-1, \u0432\u0442\u043e\u0440\u043e\u0439 \u2014 0-2 \u0438 \u0442.\u0434. \u041e\u0431\u0440\u0430\u0431\u043e\u0442\u0430\u0432 \u043f\u0430\u0440\u0443 i-j \u043f\u043e\u0442\u043e\u043a \u043f\u0435\u0440\u0435\u0445\u043e\u0434\u0438\u0442 \u043a \u043f\u0430\u0440\u0435 i-(j+N), \u0433\u0434\u0435 N \u2013 \u0447\u0438\u0441\u043b\u043e \u043f\u043e\u0442\u043e\u043a\u043e\u0432 \u0432 \u0431\u043b\u043e\u043a\u0435 \u0438 \u0435\u0441\u043b\u0438 \u0432\u044b\u0445\u043e\u0434\u0438\u0442 \u0437\u0430 \u0433\u0440\u0430\u043d\u0438\u0446\u0443 \u0434\u0438\u0430\u043f\u0430\u0437\u043e\u043d\u0430 \u0443\u0432\u0435\u043b\u0438\u0447\u0438\u0432\u0430\u0435\u0442 \u0438\u043d\u0434\u0435\u043a\u0441 \u043f\u0435\u0440\u0432\u043e\u0439 \u0447\u0430\u0441\u0442\u0438\u0446\u044b \u0432 \u043f\u0430\u0440\u0435, \u0441\u043c. \u0441\u0445\u0435\u043c\u0443:<\/p>\n<p>  <img decoding=\"async\" src=\"https:\/\/habrastorage.org\/webt\/fv\/-h\/qa\/fv-hqah4yeuzhpa9jbidswkmse8.png\"\/><\/p>\n<p>  \u041f\u0435\u0440\u0435\u0431\u043e\u0440 \u043f\u0430\u0440 \u043c\u0435\u0436\u0434\u0443 \u0440\u0430\u0437\u043d\u044b\u043c\u0438 \u044f\u0447\u0435\u0439\u043a\u0430\u043c\u0438 \u0438\u0434\u0451\u0442 \u0441\u043b\u0435\u0434\u0443\u044e\u0449\u0438\u043c \u043e\u0431\u0440\u0430\u0437\u043e\u043c: \u0432\u0441\u0435 \u043f\u043e\u0442\u043e\u043a\u0438 \u043f\u043e\u043b\u0443\u0447\u0430\u044e\u0442 \u0441\u0432\u043e\u0439 \u0438\u043d\u0442\u0435\u0440\u0432\u0430\u043b \u0438\u043d\u0434\u0435\u043a\u0441\u043e\u0432 \u0447\u0430\u0441\u0442\u0438\u0446 \u043f\u043e \u044f\u0447\u0435\u0439\u043a\u0435 A \u0438 \u0440\u0430\u0441\u0441\u0447\u0438\u0442\u044b\u0432\u0430\u044e\u0442 \u0432\u0437\u0430\u0438\u043c\u043e\u0434\u0435\u0439\u0441\u0442\u0432\u0438\u044f \u043c\u0435\u0436\u0434\u0443 \u044d\u0442\u0438\u043c\u0438 \u0447\u0430\u0441\u0442\u0438\u0446\u0430\u043c\u0438 \u0438 \u0432\u0441\u0435\u043c\u0438 \u0447\u0430\u0441\u0442\u0438\u0446\u0430\u043c\u0438 \u0432 \u044f\u0447\u0435\u0439\u043a\u0435 B. \u0412\u0442\u043e\u0440\u0430\u044f \u0444\u0443\u043d\u043a\u0446\u0438\u044f \u0432\u044b\u0447\u0438\u0441\u043b\u044f\u0435\u0442 \u0432\u0437\u0430\u0438\u043c\u043e\u0434\u0435\u0439\u0441\u0442\u0432\u0438\u044f \u0432\u043e \u0432\u0441\u0435\u0445 \u043e\u0441\u0442\u0430\u0432\u0448\u0438\u0445\u0441\u044f \u043f\u0430\u0440\u0430\u0445:<\/p>\n<pre><code class=\"cpp\">__global__ void cell_list2b(cudaMD* md) {     int iPair, iC, iCA, iCB, step, step1;      int i, j, id0, id1, N, N1, deltId;         int id;     int nA, nB, nOwn;       __shared__ float engVdW, engCoul;     float eVdW = 0.0;     float eCoul = 0.0;      extern __shared__ int shMem[];      \/\/ declaration of shared memory     int* sAids = shMem;     int* sAtypes = (int*)&sAids[md-&gt;maxAtPerCell];     float3* sAxyz = (float3*)&sAtypes[md-&gt;maxAtPerCell];     float3* sAfrs = (float3*)&sAxyz[md-&gt;maxAtPerCell];     int* sBids = (int*)&sAfrs[md-&gt;maxAtPerCell];     int* sBtypes = (int*)&sBids[md-&gt;maxAtPerCell];     float3* sBxyz = (float3*)&sBtypes[md-&gt;maxAtPerCell];     float3* sBfrs = (float3*)&sBxyz[md-&gt;maxAtPerCell];      float3* sXyz;     float3* sFrs;       int* sTypes;     int* sIds;      iPair = blockIdx.x + md-&gt;nPair1;     if (threadIdx.x == 0)     {         engVdW = 0.0;         engCoul = 0.0;     }     __syncthreads();      iCA = md-&gt;cellPairs[iPair].x;      iCB = md-&gt;cellPairs[iPair].y;     nA = md-&gt;cells[iCA][0];     nB = md-&gt;cells[iCB][0];          \/\/ \u043d\u0435\u0442 \u0441\u043c\u044b\u0441\u043b\u0430 \u0438\u0434\u0442\u0438 \u0434\u0430\u043b\u044c\u0448\u0435, \u0435\u0441\u043b\u0438 \u0445\u043e\u0442\u044f \u0431\u044b \u0432 \u043e\u0434\u043d\u043e\u0439 \u044f\u0447\u0435\u0439\u043a\u0435 \u043d\u0435\u0442 \u0447\u0430\u0441\u0442\u0438\u0446     if (!nA)        return;     if (!nB)         return;      \/\/ \u0441\u043f\u0435\u0440\u0432\u0430 \u043f\u043e\u0442\u043e\u043a\u0438 \u043a\u043e\u043f\u0438\u0440\u0443\u044e\u0442 \u0434\u0430\u043d\u043d\u044b\u0435 \u0432 shared_memory     if (threadIdx.x &lt; blockDim.x \/ 2)     {         iC = iCA;         sXyz = sAxyz;         sFrs = sAfrs;         sTypes = sAtypes;         sIds = sAids;         deltId = 0;     }     else     {         iC = iCB;         sXyz = sBxyz;         sFrs = sBfrs;         sTypes = sBtypes;         sIds = sBids;         deltId = blockDim.x \/ 2;     }     nOwn = md-&gt;cells[iC][0]; \/\/ nA or nB      step = ceilf(2 * (double)nOwn \/ (double)blockDim.x);     id0 = (threadIdx.x - deltId) * step;     N = min(id0 + step, nOwn);     for (i = id0; i &lt; N; i++)     {         id = md-&gt;cells[iC][i + 1];         sIds[i] = id;              sXyz[i] = md-&gt;xyz[id];             sFrs[i] = make_float3(0.0, 0.0, 0.0);             sTypes[i] = md-&gt;types[id];     }     __syncthreads();      \/\/ \u0432\u044b\u0447\u0438\u0441\u043b\u044f\u0435\u043c \u0432\u0437\u0430\u0438\u043c\u043e\u0434\u0435\u0439\u0441\u0442\u0432\u0438\u044f \u043c\u0435\u0436\u0434\u0443 \u0430\u0442\u043e\u043c\u0430\u043c\u0438 \u0432 \u0440\u0430\u0437\u043d\u044b\u0445 \u044f\u0447\u0435\u0439\u043a\u0430\u0445     step1 = ceilf((double)nA \/ (double)blockDim.x);     id1 = threadIdx.x * step1;     N1 = min(id1 + step1, nA);     for (i = id1; i &lt; N1; i++)         for (j = 0; j &lt; nB; j++)         {             pair_between_cell1(sAxyz[i], &sAfrs[i], sAtypes[i], sBxyz[j], &sBfrs[j], sBtypes[j], md-&gt;cellShifts[iPair], md, eVdW, eCoul);          }     __syncthreads();     \/\/ \u043a\u043e\u043f\u0438\u0440\u0443\u0435\u043c \u0432\u044b\u0447\u0438\u0441\u043b\u0435\u043d\u043d\u044b\u0435 \u0441\u0438\u043b\u044b \u0432 global memory     for (i = id0; i &lt; N; i++)     {         atomicAdd(&(md-&gt;frs[sIds[i]].x), sFrs[i].x);         atomicAdd(&(md-&gt;frs[sIds[i]].y), sFrs[i].y);         atomicAdd(&(md-&gt;frs[sIds[i]].z), sFrs[i].z);     }      atomicAdd(&engCoul, eCoul);     atomicAdd(&engVdW, eVdW);     __syncthreads();       if (threadIdx.x == 0)     {         atomicAdd(&md-&gt;engCoul1, engCoul);         atomicAdd(&md-&gt;engVdW, engVdW);     } } <\/code><\/pre>\n<p>  \u041a\u043e\u0434 \u043f\u043e\u0447\u0442\u0438 \u0430\u043d\u0430\u043b\u043e\u0433\u0438\u0447\u0435\u043d \u043f\u0440\u0435\u0434\u044b\u0434\u0443\u0449\u0435\u0439 \u0444\u0443\u043d\u043a\u0446\u0438\u0438, \u0442\u043e\u043b\u044c\u043a\u043e \u0442\u0435\u043f\u0435\u0440\u044c \u043e\u0431\u0440\u0430\u0431\u0430\u0442\u044b\u0432\u0430\u044e\u0442\u0441\u044f \u043e\u0441\u0442\u0430\u0432\u0448\u0438\u0435\u0441\u044f \u043f\u0430\u0440\u044b (\u0438\u043d\u0434\u0435\u043a\u0441 \u043f\u0430\u0440\u044b \u0441\u0434\u0432\u0438\u0433\u0430\u0435\u0442\u0441\u044f \u043d\u0430 <b>md-&gt;nPair1<\/b>), \u0432\u044b\u0447\u0438\u0441\u043b\u044f\u0435\u0442\u0441\u044f \u0432\u0437\u0430\u0438\u043c\u043e\u0434\u0435\u0439\u0441\u0442\u0432\u0438\u0435 \u0442\u043e\u043b\u044c\u043a\u043e \u043c\u0435\u0436\u0434\u0443 \u043f\u0430\u0440\u043e\u0439 \u044f\u0447\u0435\u0435\u043a (\u0432\u043d\u0443\u0442\u0440\u0438 \u044f\u0447\u0435\u0435\u043a \u0443\u0436\u0435 \u043f\u043e\u0441\u0447\u0438\u0442\u0430\u043d\u043e) \u0438 \u043f\u0440\u0438 \u043a\u043e\u043f\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u0438 \u0432 \u0433\u043b\u043e\u0431\u0430\u043b\u044c\u043d\u0443\u044e \u043f\u0430\u043c\u044f\u0442\u044c \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u0435\u043c atomicAdd, \u0447\u0442\u043e\u0431\u044b \u0441\u0443\u043c\u043c\u0438\u0440\u043e\u0432\u0430\u0442\u044c \u0440\u0435\u0437\u0443\u043b\u044c\u0442\u0430\u0442\u044b, \u0430 \u043d\u0435 \u043f\u0435\u0440\u0435\u0437\u0430\u043f\u0438\u0441\u0430\u0442\u044c \u0438\u0445. \u0422\u0435\u043f\u0435\u0440\u044c \u043f\u0440\u0438\u0432\u043e\u0436\u0443 \u043e\u0441\u0442\u0430\u0432\u0448\u0438\u0435\u0441\u044f \u0444\u0443\u043d\u043a\u0446\u0438\u0438:<\/p>\n<pre><code class=\"cpp\">__device__ void keep_in_cell(int index, float3 xyz, cudaMD* md) \/\/ \u043f\u043e\u043c\u0435\u0449\u0430\u0435\u0442 index \u0447\u0430\u0441\u0442\u0438\u0446\u044b \u0441 \u043a\u043e\u043e\u0440\u0434\u0438\u043d\u0430\u0442\u0430\u043c\u0438 xyz \u0432 cell list {     \/\/ \u043e\u043f\u0440\u0435\u0434\u0435\u043b\u044f\u0435\u043c \u0438\u043d\u0434\u0435\u043a\u0441 \u044f\u0447\u0435\u0439\u043a\u0438     int c = floor((double)xyz.x \/ (double)md-&gt;cSize.x) * md-&gt;cnYZ + floor((double)xyz.y \/ (double)md-&gt;cSize.y) * md-&gt;cNumber.z + floor((double)xyz.z \/ (double)md-&gt;cSize.z);      int j = atomicAdd(&(md-&gt;cells[c][0]), 1);     md-&gt;cells[c][j + 1] = index; } <\/code><\/pre>\n<p>  \u041d\u0430 \u043e\u0441\u043d\u043e\u0432\u0430\u043d\u0438\u0438 \u043a\u043e\u043e\u0440\u0434\u0438\u043d\u0430\u0442 \u0432\u044b\u0447\u0438\u0441\u043b\u044f\u0435\u043c \u0438\u043d\u0434\u0435\u043a\u0441 \u0442\u043e\u0439 \u044f\u0447\u0435\u0439\u043a\u0438, \u043a\u0443\u0434\u0430 \u043f\u043e\u043f\u0430\u0434\u0430\u0435\u0442 \u0434\u0430\u043d\u043d\u0430\u044f \u0447\u0430\u0441\u0442\u0438\u0446\u0430. \u0423\u0432\u0435\u043b\u0438\u0447\u0438\u0432\u0430\u0435\u043c \u0441\u0447\u0435\u0442\u0447\u0438\u043a \u0447\u0430\u0441\u0442\u0438\u0446 \u0432 \u0434\u0430\u043d\u043d\u043e\u0439 \u044f\u0447\u0435\u0439\u043a\u0435. \u0417\u0430\u043f\u0438\u0441\u044b\u0432\u0430\u0435\u043c \u0438\u043d\u0434\u0435\u043a\u0441 \u0447\u0430\u0441\u0442\u0438\u0446\u044b \u0432 \u043d\u043e\u0432\u0443\u044e \u044f\u0447\u0435\u0439\u043a\u0443. <b>\u0441Size <\/b>\u2013 \u0440\u0430\u0437\u043c\u0435\u0440\u044b \u044f\u0447\u0435\u0439\u043a\u0438, <b>cnYZ <\/b>\u2013 \u043f\u0440\u043e\u0438\u0437\u0432\u0435\u0434\u0435\u043d\u0438\u0435 \u0447\u0438\u0441\u043b\u0430 \u044f\u0447\u0435\u0435\u043a \u043f\u043e \u0438\u0437\u043c\u0435\u0440\u0435\u043d\u0438\u044f\u043c Y \u0438 Z. <font color=\"red\">\u041c\u043e\u0436\u0435\u0442 \u0431\u044b\u0442\u044c \u0441\u0442\u043e\u0438\u0442 \u043d\u0435 \u0432\u044b\u0447\u0438\u0441\u043b\u044f\u0442\u044c \u0438\u043d\u0434\u0435\u043a\u0441 \u044f\u0447\u0435\u0439\u043a\u0438, \u0430 \u0445\u0440\u0430\u043d\u0438\u0442\u044c \u0438\u0445 \u0432 \u0432\u0438\u0434\u0435 3-\u043c\u0435\u0440\u043d\u043e\u0433\u043e \u043c\u0430\u0441\u0441\u0438\u0432\u0430 \u0432 \u0442\u0435\u043a\u0441\u0442\u0443\u0440\u043d\u043e\u0439 \u043f\u0430\u043c\u044f\u0442\u0438, \u043e\u0431\u0440\u0430\u0449\u0430\u044f\u0441\u044c \u043f\u043e \u0438\u043d\u0434\u0435\u043a\u0441\u0430\u043c \u0432\u0438\u0434\u0430 [x \/ md-&gt;cSize.x]. \u0414\u0430\u0441\u0442 \u043b\u0438 \u044d\u0442\u043e \u043f\u0440\u0438\u0440\u043e\u0441\u0442 \u0432 \u043f\u0440\u043e\u0438\u0437\u0432\u043e\u0434\u0438\u0442\u0435\u043b\u044c\u043d\u043e\u0441\u0442\u0438?<\/font><\/p>\n<p>  \u0424\u0443\u043d\u043a\u0446\u0438\u0438, \u0432\u044b\u0447\u0438\u0441\u043b\u044f\u044e\u0449\u0438\u0435 \u0432\u0437\u0430\u0438\u043c\u043e\u0434\u0435\u0439\u0441\u0442\u0432\u0438\u044f:<\/p>\n<pre><code class=\"cpp\">__device__ void pair_in_cell(float3 xyzA, float3* fxyzA, int typeA, float3 xyzB, float3* fxyzB, int typeB, cudaMD* md, float& engVdw, float& engCoul) {     float r, r2, f;     float dx, dy, dz;     cudaVdW* vdw = NULL;      dx = xyzA.x - xyzB.x;      dy = xyzA.y - xyzB.y;     dz = xyzA.z - xyzB.z;     r2 = dx * dx + dy * dy + dz * dz;      \/\/if (r2 &lt;= sim-&gt;r2Max)         \/\/{     r = 0.0;     f = 0.0;      \/\/ \u041a\u0443\u043b\u043e\u043d\u043e\u0432\u0441\u043a\u043e\u0435 \u0432\u0437\u0430\u0438\u043c\u043e\u0434\u0435\u0439\u0441\u0442\u0432\u0438\u0435     f += real_ewald(r2, r, md-&gt;chProd[typeA][typeB], md-&gt;alpha, engCoul);      \/\/ \u0412\u0430\u043d-\u0434\u0435\u0440-\u0412\u0430\u0430\u043b\u044c\u0441\u043e\u0432\u043e \u0432\u0437\u0430\u0438\u043c\u043e\u0434\u0435\u0439\u0441\u0442\u0432\u0438\u0435     vdw = md-&gt;vdws[typeA][typeB];     if (vdw != NULL)         \/\/if (r2 &lt;= vdw-&gt;r2cut)   \/\/! \u0432\u043d\u0443\u0442\u0440\u0438 \u044f\u0447\u0435\u0439\u043a\u0438 \u044d\u0442\u0443 \u043f\u0440\u043e\u0432\u0435\u0440\u043a\u0443 \u043c\u043e\u0436\u043d\u043e \u043e\u043f\u0443\u0441\u0442\u0438\u0442\u044c             f += vdw-&gt;feng_r(r2, r, vdw, engVdw);      \/\/ \u0432 \u044d\u0442\u043e\u043c \u0441\u043b\u0443\u0447\u0430\u0435 \u043d\u0435\u043e\u0431\u0445\u043e\u0434\u0438\u043c\u043e \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u044c\u0441\u044f atomic, \u043f\u043e\u0441\u043a\u043e\u043b\u044c\u043a\u0443 \u043e\u0434\u043d\u0438 \u0447\u0430\u0441\u0442\u0438\u0446\u044b \u043c\u043e\u0433\u0443\u0442 \u043e\u0431\u0440\u0430\u0431\u0430\u0442\u044b\u0432\u0430\u0442\u044c\u0441\u044f \u0441\u0440\u0430\u0437\u0443 \u0440\u0430\u0437\u043d\u044b\u043c\u0438 \u043f\u043e\u0442\u043e\u043a\u0430\u043c\u0438     atomicAdd(&(fxyzA-&gt;x), f * dx);     atomicAdd(&(fxyzB-&gt;x), -f * dx);     atomicAdd(&(fxyzA-&gt;y), f * dy);     atomicAdd(&(fxyzB-&gt;y), -f * dy);     atomicAdd(&(fxyzA-&gt;z), f * dz);     atomicAdd(&(fxyzB-&gt;z), -f * dz);     \/\/} } <\/code><\/pre>\n<p>  \u0412\u044b\u0447\u0438\u0441\u043b\u044f\u0435\u043c \u0440\u0430\u0441\u0441\u0442\u043e\u044f\u043d\u0438\u0435 \u043c\u0435\u0436\u0434\u0443 \u0447\u0430\u0441\u0442\u0438\u0446\u0430\u043c\u0438, \u043f\u043e\u0434\u0441\u0442\u0430\u0432\u043b\u044f\u0435\u043c \u0435\u0433\u043e \u0441\u043d\u0430\u0447\u0430\u043b\u0430 \u0432 \u0444\u0443\u043d\u043a\u0446\u0438\u044e \u0434\u043b\u044f \u041a\u0443\u043b\u043e\u043d\u043e\u0432\u0441\u043a\u043e\u0433\u043e, \u0430 \u0437\u0430\u0442\u0435\u043c \u0434\u043b\u044f \u0412\u0430\u043d-\u0434\u0435\u0440-\u0412\u0430\u0430\u043b\u044c\u0441\u043e\u0432\u0430 \u0432\u0437\u0430\u0438\u043c\u043e\u0434\u0435\u0439\u0441\u0442\u0432\u0438\u044f. \u0415\u0441\u043b\u0438 \u0440\u0430\u0437\u043c\u0435\u0440 \u044f\u0447\u0435\u0439\u043a\u0438 \u0432\u044b\u0431\u0440\u0430\u0442\u044c \u0442\u0430\u043a\u0438\u043c \u043e\u0431\u0440\u0430\u0437\u043e\u043c, \u0447\u0442\u043e\u0431\u044b \u0435\u0451 \u0434\u0438\u0430\u0433\u043e\u043d\u0430\u043b\u044c \u043d\u0435 \u043f\u0440\u0435\u0432\u044b\u0448\u0430\u043b\u0430 \u0434\u0430\u043b\u044c\u043d\u043e\u0441\u0442\u0438 \u0441\u0430\u043c\u043e\u0433\u043e \u043a\u043e\u0440\u043e\u0442\u043a\u043e\u0433\u043e \u0442\u0438\u043f\u0430 \u0432\u0437\u0430\u0438\u043c\u043e\u0434\u0435\u0439\u0441\u0442\u0432\u0438\u0439, \u0442\u043e \u043f\u0440\u043e\u0432\u0435\u0440\u043a\u0438 \u0440\u0430\u0441\u0441\u0442\u043e\u044f\u043d\u0438\u0439 \u043c\u043e\u0436\u043d\u043e \u0443\u0431\u0440\u0430\u0442\u044c (\u044f \u0441\u043f\u0435\u0446\u0438\u0430\u043b\u044c\u043d\u043e \u043e\u0441\u0442\u0430\u0432\u0438\u043b \u0438\u0445 \u0437\u0430\u043a\u043e\u043c\u043c\u0435\u043d\u0442\u0438\u0440\u043e\u0432\u0430\u043d\u043d\u044b\u043c\u0438 \u0432 \u043a\u043e\u0434\u0435). \u0417\u0430\u043c\u0435\u0447\u0443, \u0447\u0442\u043e \u0437\u0434\u0435\u0441\u044c \u044f \u0432\u044b\u0447\u0438\u0441\u043b\u044f\u044e \u043a\u0432\u0430\u0434\u0440\u0430\u0442 \u0440\u0430\u0441\u0441\u0442\u043e\u044f\u043d\u0438\u044f (<b>r2<\/b>), \u0430 \u0441\u0430\u043c\u043e \u0440\u0430\u0441\u0441\u0442\u043e\u044f\u043d\u0438\u0435 (<b>r<\/b>) \u0432\u044b\u0447\u0438\u0441\u043b\u044f\u0435\u0442\u0441\u044f \u0432 \u0444\u0443\u043d\u043a\u0446\u0438\u0438 <i>real_ewald<\/i>. \u041c\u0430\u0441\u0441\u0438\u0432 <b>chProd[i][j]<\/b> \u0445\u0440\u0430\u043d\u0438\u0442 \u043f\u0440\u043e\u0438\u0437\u0432\u0435\u0434\u0435\u043d\u0438\u0435 \u0437\u0430\u0440\u044f\u0434\u043e\u0432 \u0441\u043e\u043e\u0442\u0432\u0435\u0442\u0441\u0442\u0432\u0443\u044e\u0449\u0438\u0445 \u0442\u0438\u043f\u043e\u0432 \u0447\u0430\u0441\u0442\u0438\u0446. \u0412\u043e\u0437\u043c\u043e\u0436\u043d\u043e \u0435\u0433\u043e \u0442\u043e\u0436\u0435 \u0441\u0442\u043e\u0438\u0442 \u043f\u043e\u043c\u0435\u0441\u0442\u0438\u0442\u044c \u0432 \u0442\u0435\u043a\u0441\u0442\u0443\u0440\u043d\u0443\u044e \u043f\u0430\u043c\u044f\u0442\u044c. \u0421\u0442\u0440\u0443\u043a\u0442\u0443\u0440\u0430 vdw \u0445\u0440\u0430\u043d\u0438\u0442 \u043f\u0430\u0440\u0430\u043c\u0435\u0442\u0440\u044b \u043f\u0430\u0440\u043d\u043e\u0433\u043e \u043f\u043e\u0442\u0435\u043d\u0446\u0438\u0430\u043b\u0430 \u0438 \u0443\u043a\u0430\u0437\u0430\u0442\u0435\u043b\u044c \u043d\u0430 \u0444\u0443\u043d\u043a\u0446\u0438\u044e (<b>feng_r<\/b>) \u0434\u043b\u044f \u0432\u044b\u0447\u0438\u0441\u043b\u0435\u043d\u0438\u044f \u0412\u0430\u043d-\u0434\u0435\u0440-\u0412\u0430\u0430\u043b\u044c\u0441\u043e\u0432\u0430 \u0432\u0437\u0430\u0438\u043c\u043e\u0434\u0435\u0439\u0441\u0442\u0432\u0438\u044f. <br \/>  \u0424\u0443\u043d\u043a\u0446\u0438\u044f \u0434\u043b\u044f \u0432\u044b\u0447\u0438\u0441\u043b\u0435\u043d\u0438\u044f \u0432\u0437\u0430\u0438\u043c\u043e\u0434\u0435\u0439\u0441\u0442\u0432\u0438\u0439 \u043c\u0435\u0436\u0434\u0443 \u0434\u0432\u0443\u043c\u044f \u0440\u0430\u0437\u043d\u044b\u043c\u0438 \u044f\u0447\u0435\u0439\u043a\u0430\u043c\u0438:<\/p>\n<pre><code class=\"cpp\">__device__ void pair_between_cell1(float3 xyzA, float3* fxyzA, int typeA, float3 xyzB, float3* fxyzB, int typeB, float3 shift, cudaMD* md, float& engVdw, float& engCoul) {     float r, r2, f;     float dx, dy, dz;     cudaVdW* vdw;      dx = xyzA.x - xyzB.x - shift.x;     dy = xyzA.y - xyzB.y - shift.y;     dz = xyzA.z - xyzB.z - shift.z;     r2 = dx * dx + dy * dy + dz * dz;      if (r2 &lt;= md-&gt;r2Real)     {         r = 0.0;         f = 0.0;          f += real_ewald(r2, r, md-&gt;chProd[typeA][typeB], md-&gt;alpha, engCoul);           vdw = md-&gt;vdws[typeA][typeB];         if (vdw != NULL)             if (r2 &lt;= vdw-&gt;r2cut)                    f += vdw-&gt;feng_r(r2, r, vdw, engVdw);           fxyzA-&gt;x += f * dx;         atomicAdd(&(fxyzB-&gt;x), -f * dx);         fxyzA-&gt;y += f * dy;         atomicAdd(&(fxyzB-&gt;y), -f * dy);         fxyzA-&gt;z += f * dz;         atomicAdd(&(fxyzB-&gt;z), -f * dz);     } } <\/code><\/pre>\n<p>  \u041a\u043e\u0434 \u043f\u0440\u0430\u043a\u0442\u0438\u0447\u0435\u0441\u043a\u0438 \u0438\u0434\u0435\u043d\u0442\u0438\u0447\u0435\u043d \u043f\u0440\u0435\u0434\u044b\u0434\u0443\u0449\u0435\u0439 \u0444\u0443\u043d\u043a\u0446\u0438\u0438, \u0435\u0441\u0442\u044c \u043f\u043e\u043f\u0440\u0430\u0432\u043a\u0430 \u043a \u0440\u0430\u0437\u043d\u0438\u0446\u0435 \u043a\u043e\u043e\u0440\u0434\u0438\u043d\u0430\u0442 \u0434\u043b\u044f \u0443\u0447\u0435\u0442\u0430 \u043f\u0435\u0440\u0438\u043e\u0434\u0438\u0447\u0435\u0441\u043a\u0438\u0445 \u0433\u0440\u0430\u043d\u0438\u0447\u043d\u044b\u0445 \u0443\u0441\u043b\u043e\u0432\u0438\u0439, \u0440\u0430\u0441\u043a\u043e\u043c\u043c\u0435\u043d\u0442\u0438\u0440\u043e\u0432\u0430\u043d\u044b \u043f\u0440\u043e\u0432\u0435\u0440\u043a\u0438 \u0440\u0430\u0441\u0441\u0442\u043e\u044f\u043d\u0438\u0439 \u0438, \u043a\u0430\u043a \u043c\u044b \u043f\u043e\u043c\u043d\u0438\u043c \u0438\u0437 \u0444\u0443\u043d\u043a\u0446\u0438\u0439 \u0433\u0440\u0443\u043f\u043f\u044b \u0444\u0443\u043d\u043a\u0446\u0438\u0439 <i>cell_list <\/i>\u043d\u0435\u0442 \u043d\u0443\u0436\u0434\u044b \u043f\u0440\u0438\u043c\u0435\u043d\u044f\u0442\u044c <i>atomicAdd <\/i>\u043a \u044f\u0447\u0435\u0439\u043a\u0435 A, \u043f\u043e\u0442\u043e\u043c\u0443 \u0447\u0442\u043e \u0447\u0430\u0441\u0442\u0438\u0446\u044b \u0432 \u043d\u0435\u0439 \u043e\u0431\u0440\u0430\u0431\u0430\u0442\u044b\u0432\u0430\u044e\u0442\u0441\u044f \u043d\u0435\u0437\u0430\u0432\u0438\u0441\u0438\u043c\u043e. <font color=\"red\">\u0417\u0430\u043c\u0435\u0447\u0443, \u0447\u0442\u043e \u0432 \u0437\u0430\u0432\u0438\u0441\u0438\u043c\u043e\u0441\u0442\u0438 \u043e\u0442 \u0440\u0430\u0441\u0441\u0442\u043e\u044f\u043d\u0438\u044f \u043c\u0435\u0436\u0434\u0443 \u043a\u043e\u043d\u043a\u0440\u0435\u0442\u043d\u044b\u043c\u0438 \u044f\u0447\u0435\u0439\u043a\u0430\u043c\u0438 \u0432 \u043f\u0430\u0440\u0435 \u043c\u043e\u0436\u043d\u043e \u043e\u043f\u0443\u0441\u0442\u0438\u0442\u044c \u043d\u0435\u043a\u043e\u0442\u043e\u0440\u044b\u0435 \u043f\u0440\u043e\u0432\u0435\u0440\u043a\u0438 \u0440\u0430\u0441\u0441\u0442\u043e\u044f\u043d\u0438\u0439 \u0438 \u0432\u044b\u0447\u0438\u0441\u043b\u0435\u043d\u0438\u044f. \u0414\u043b\u044f \u044d\u0442\u043e\u0433\u043e \u043c\u043e\u0436\u043d\u043e \u043d\u0430\u043f\u0438\u0441\u0430\u0442\u044c \u0441\u043b\u0435\u0433\u043a\u0430 \u0440\u0430\u0437\u043b\u0438\u0447\u043d\u044b\u0435 \u0432\u0430\u0440\u0438\u0430\u043d\u0442\u044b \u044d\u0442\u043e\u0439 \u0444\u0443\u043d\u043a\u0446\u0438\u0439.<\/font> \u041f\u0440\u0438\u0432\u043e\u0436\u0443 \u0442\u0430\u043a\u0436\u0435 \u0444\u0443\u043d\u043a\u0446\u0438\u0438 \u0432\u044b\u0447\u0438\u0441\u043b\u044f\u044e\u0449\u0438\u0435 \u0441\u0438\u043b\u044b \u0438 \u044d\u043d\u0435\u0440\u0433\u0438\u0438 \u043f\u0430\u0440\u043d\u044b\u0445 \u043f\u043e\u0442\u0435\u043d\u0446\u0438\u0430\u043b\u043e\u0432 \u0434\u043b\u044f \u043f\u043e\u0442\u0435\u043d\u0446\u0438\u0430\u043b\u0430 \u041b\u0435\u043d\u043d\u0430\u0440\u0434\u0430-\u0414\u0436\u043e\u043d\u0441\u0430 \u0438 \u0411\u0443\u043a\u0438\u043d\u0433\u0435\u043c\u0430:<\/p>\n<pre><code class=\"cpp\">__device__ float cu_fe_lj(float r2, cudaVdW* vdw, float& eng) \/\/ U = 4e[(s\/r)^12 - (s\/r)^6] {     float r2i = 1.0 \/ r2;     float sr2 = vdw-&gt;p1 * r2i;     float sr6 = sr2 * sr2 * sr2;      eng += vdw-&gt;p0 * sr6 * (sr6 - 1.0);     return vdw-&gt;p2 * r2i * sr6 * (2.0 * sr6 - 1.0); }  __device__ float cu_fer_buck(float r2, float& r, cudaVdW* vdw, float& eng) \/\/ U = A exp(-r\/ro) - C\/r^6 {     float r2i = 1.0 \/ r2;     float r4i = r2i * r2i;     if (r == 0.0)    \/\/ \u0435\u0441\u043b\u0438 r \u043d\u0435\u0438\u0437\u0432\u0435\u0441\u0442\u043d\u043e, \u0432\u044b\u0447\u0438\u0441\u043b\u0438\u043c         r = sqrt(r2);      eng += vdw-&gt;p0 * exp(-r \/ vdw-&gt;p1) - vdw-&gt;p2 * r4i * r2i;     return vdw-&gt;p0 * exp(-r \/ vdw-&gt;p1) \/ r \/ vdw-&gt;p1 - 6.0 * vdw-&gt;p2 * r4i * r4i; } <\/code><\/pre>\n<p>  \u0424\u0443\u043d\u043a\u0446\u0438\u0438 \u0432\u043e\u0437\u0432\u0440\u0430\u0449\u0430\u044e\u0442 \u0441\u0438\u043b\u0443 (\u043a\u043e\u0442\u043e\u0440\u0443\u044e \u043d\u0443\u0436\u043d\u043e \u0434\u043e\u043c\u043d\u043e\u0436\u0438\u0442\u044c \u043d\u0430 \u043f\u0440\u043e\u0435\u043a\u0446\u0438\u0438 \u0432\u0435\u043a\u0442\u043e\u0440\u0430 \u0440\u0430\u0441\u0441\u0442\u043e\u044f\u043d\u0438\u044f) \u0438 \u0434\u043e\u0431\u0430\u0432\u043b\u044f\u044e\u0442 \u044d\u043d\u0435\u0440\u0433\u0438\u044e \u0432 \u043f\u0435\u0440\u0435\u043c\u0435\u043d\u043d\u0443\u044e <b>eng<\/b>. \u0423\u043a\u0430\u0437\u0430\u0442\u0435\u043b\u044c \u043d\u0430 \u043e\u0434\u043d\u0443 \u0438\u0437 \u044d\u0442\u0438\u0445 \u0444\u0443\u043d\u043a\u0446\u0438\u0439 \u0445\u0440\u0430\u043d\u0438\u0442\u0441\u044f \u0432 \u0441\u0442\u0440\u0443\u043a\u0442\u0443\u0440\u0435 cudaVdW. <font color=\"red\">\u0412\u043e\u043e\u0431\u0449\u0435 \u0433\u043e\u0432\u043e\u0440\u044f, \u0434\u043b\u044f \u043f\u043e\u043b\u0443\u0447\u0435\u043d\u0438\u044f \u0442\u0440\u0430\u0435\u043a\u0442\u043e\u0440\u0438\u0439 \u0434\u0432\u0438\u0436\u0435\u043d\u0438\u044f \u044d\u043d\u0435\u0440\u0433\u0438\u044e \u043c\u043e\u0436\u043d\u043e \u0438 \u043d\u0435 \u0432\u044b\u0447\u0438\u0441\u043b\u044f\u0442\u044c, \u043e\u043d\u0430 \u043d\u0443\u0436\u043d\u0430 \u0434\u043b\u044f \u0440\u0430\u0437\u043d\u044b\u0445 \u0441\u0442\u0430\u0442\u0438\u0441\u0442\u0438\u043a. \u0415\u0441\u043b\u0438 \u043c\u044b \u0443\u0431\u0435\u0440\u0435\u043c \u0438\u0437 \u044d\u0442\u0438\u0445 \u0444\u0443\u043d\u043a\u0446\u0438\u0439 \u0432\u044b\u0440\u0430\u0436\u0435\u043d\u0438\u044f \u0434\u043b\u044f \u044d\u043d\u0435\u0440\u0433\u0438\u0438, \u0440\u0430\u0441\u0447\u0435\u0442\u044b, \u0432\u0435\u0440\u043e\u044f\u0442\u043d\u043e, \u0435\u0449\u0451 \u0443\u0441\u043a\u043e\u0440\u044f\u0442\u0441\u044f. \u0410 \u043c\u043e\u0436\u043d\u043e \u0441\u0434\u0435\u043b\u0430\u0442\u044c \u0442\u0430\u043a: \u0440\u0430\u0437 \u0432 \u043d\u0435\u0441\u043a\u043e\u043b\u044c\u043a\u043e \u0448\u0430\u0433\u043e\u0432 \u0432\u044b\u0437\u044b\u0432\u0430\u0442\u044c \u043f\u043e\u043b\u043d\u0443\u044e \u0444\u0443\u043d\u043a\u0446\u0438\u044e, \u0430 \u0432 \u043e\u0441\u0442\u0430\u043b\u044c\u043d\u044b\u0435 \u0440\u0430\u0437\u044b \u2013 \u0442\u043e\u043b\u044c\u043a\u043e \u0440\u0435\u0434\u0443\u0446\u0438\u0440\u043e\u0432\u0430\u043d\u043d\u044b\u0439 \u0430\u043d\u0430\u043b\u043e\u0433.<\/font> \u0427\u0430\u0441\u0442\u044c \u041a\u0443\u043b\u043e\u043d\u043e\u0432\u0441\u043a\u043e\u0433\u043e \u0432\u0437\u0430\u0438\u043c\u043e\u0434\u0435\u0439\u0441\u0442\u0432\u0438\u044f \u0432\u044b\u0447\u0438\u0441\u043b\u044f\u0435\u0442\u0441\u044f \u0444\u0443\u043d\u043a\u0446\u0438\u0435\u0439 <i>real_ewald<\/i>:<\/p>\n<pre><code class=\"cpp\">__device__ float real_ewald(float r2, float& r, float chprd, float alpha, float& eng) {     float ar;      float erfcar;     float kqq = chprd * d_Fcoul_scale; \/\/ q[i]*q[j]*1\/4pie0;      r = sqrt(r2);     ar = alpha * r;     erfcar = erfc(ar);      eng += kqq * erfcar \/ r;     return kqq \/ r \/ r2 * (erfcar + 2 * ar \/ d_sqrtpi * exp(-ar * ar)); } <\/code><\/pre>\n<p>  \u042d\u0442\u043e \u043e\u0442\u043b\u0438\u0447\u0430\u0435\u0442\u0441\u044f \u043e\u0442 \u0437\u043d\u0430\u043a\u043e\u043c\u043e\u0433\u043e \u0437\u0430\u043a\u043e\u043d\u0430 \u041a\u0443\u043b\u043e\u043d\u0430, \u043d\u043e \u043e\u0431 \u044d\u0442\u043e\u043c \u0432 \u043e\u0442\u0434\u0435\u043b\u044c\u043d\u043e\u0439 \u0441\u0442\u0430\u0442\u044c\u0435.<\/p>\n<p>  \u0422\u0435\u0441\u0442\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u0435 \u043d\u0430 \u0440\u0435\u0430\u043b\u044c\u043d\u043e\u043c \u043f\u0440\u0438\u043c\u0435\u0440\u0435 \u043f\u043e\u043a\u0430\u0437\u0430\u043b\u043e, \u0447\u0442\u043e \u0447\u0430\u0441\u0442\u0438\u0446 \u0432 \u043f\u0430\u0440\u0435 \u044f\u0447\u0435\u0435\u043a \u043e\u0447\u0435\u043d\u044c \u043c\u0430\u043b\u043e, \u0447\u0442\u043e\u0431\u044b \u0437\u0430\u0433\u0440\u0443\u0437\u0438\u0442\u044c \u0432\u0441\u0435 \u043f\u043e\u0442\u043e\u043a\u0438, \u0432\u044b\u0434\u0435\u043b\u044f\u0435\u043c\u044b\u0435 \u043d\u0430 \u0431\u043b\u043e\u043a. \u0414\u0430\u043b\u044c\u043d\u0435\u0439\u0448\u0430\u044f \u043e\u043f\u0442\u0438\u043c\u0438\u0437\u0430\u0446\u0438\u044f \u0444\u0443\u043d\u043a\u0446\u0438\u0439<i> cell_list2a<\/i> \u0438 <i>cell_list2b <\/i>\u0437\u0430\u043a\u043b\u044e\u0447\u0430\u0435\u0442\u0441\u044f \u0432 \u0442\u043e\u043c, \u0447\u0442\u043e\u0431\u044b \u043e\u0431\u0440\u0430\u0431\u0430\u0442\u044b\u0432\u0430\u0442\u044c \u0441\u0440\u0430\u0437\u0443 \u043d\u0435\u0441\u043a\u043e\u043b\u044c\u043a\u043e \u043f\u0430\u0440 \u0432 \u043e\u0434\u043d\u043e\u043c \u0431\u043b\u043e\u043a\u0435. \u041f\u043e\u043a\u0430 \u044f \u043d\u0430\u043f\u0438\u0441\u0430\u043b \u0442\u043e\u043b\u044c\u043a\u043e \u043f\u0440\u043e\u0441\u0442\u0435\u0439\u0448\u0438\u0439 \u0432\u0430\u0440\u0438\u0430\u043d\u0442, \u0433\u0434\u0435 \u043f\u043e\u0442\u043e\u043a\u0438 \u043f\u0440\u043e\u0441\u0442\u043e \u0434\u0435\u043b\u044f\u0442\u0441\u044f \u043d\u0430 \u043d\u0435\u0441\u043a\u043e\u043b\u044c\u043a\u043e \u043f\u0430\u0440 \u044f\u0447\u0435\u0435\u043a, \u0442.\u0435. \u043e\u0434\u0438\u043d \u0431\u043b\u043e\u043a \u043e\u0431\u0440\u0430\u0431\u0430\u0442\u044b\u0432\u0430\u0435\u0442 \u043d\u0435 \u043e\u0434\u043d\u0443 \u043f\u0430\u0440\u0443, \u0430 \u0441\u043a\u0430\u0436\u0435\u043c 4: 0-1, 1-2, 3-4, 5-6. \u041c\u043e\u0436\u043d\u043e \u0437\u0430\u043c\u0435\u0442\u0438\u0442\u044c, \u0447\u0442\u043e \u0432 \u044d\u0442\u043e\u043c \u0441\u043b\u0443\u0447\u0430\u0435 \u0437\u0430\u0433\u0440\u0443\u0437\u0438\u0432 \u0434\u0430\u043d\u043d\u044b\u0435 \u0432 shared memory \u043c\u043e\u0436\u043d\u043e \u0437\u0430\u043e\u0434\u043d\u043e \u043e\u0431\u0440\u0430\u0431\u043e\u0442\u0430\u0442\u044c \u043f\u0430\u0440\u044b 0-2, 0-3, 0-4 \u0438 \u0442.\u0434. \u041e\u0434\u043d\u0430\u043a\u043e \u044d\u0442\u043e \u0442\u0440\u0435\u0431\u0443\u0435\u0442 \u0434\u043e\u043f\u043e\u043b\u043d\u0438\u0442\u0435\u043b\u044c\u043d\u044b\u0445 \u0443\u0445\u0438\u0449\u0440\u0435\u043d\u0438\u0439 \u043d\u0430 \u044d\u0442\u0430\u043f\u0435 \u043f\u043e\u0434\u0433\u043e\u0442\u043e\u0432\u043a\u0438 \u0434\u0430\u043d\u043d\u044b\u0445, \u043a\u043e\u0442\u043e\u0440\u044b\u0435 \u044f \u0435\u0449\u0451 \u043d\u0435 \u043f\u0440\u043e\u0434\u0443\u043c\u0430\u043b. \u0422\u0430\u043a\u0436\u0435 \u0435\u0441\u043b\u0438 \u0432 \u0444\u0443\u043d\u043a\u0446\u0438\u0438 <i>cell_list2b <\/i>\u0437\u0430\u0433\u0440\u0443\u0436\u0430\u0442\u044c \u043f\u0430\u0440\u044b \u0441 \u043e\u0431\u0449\u0435\u0439 \u044f\u0447\u0435\u0439\u043a\u043e\u0439 (\u043d\u0430\u043f\u0440\u0438\u043c\u0435\u0440, \u0442\u0435 \u0436\u0435 0-2, 0-3, 0-4 \u0438 \u0442.\u0434.), \u0442\u043e \u043c\u043e\u0436\u043d\u043e \u0441\u043e\u043a\u0440\u0430\u0442\u0438\u0442\u044c \u0447\u0438\u0441\u043b\u043e \u043e\u0431\u0440\u0430\u0449\u0435\u043d\u0438\u0439 \u043a \u0433\u043b\u043e\u0431\u0430\u043b\u044c\u043d\u043e\u0439 \u043f\u0430\u043c\u044f\u0442\u0438, \u0441\u043a\u043e\u043f\u0438\u0440\u043e\u0432\u0430\u0432 \u0434\u0430\u043d\u043d\u044b\u0435 \u0438\u0437 \u044f\u0447\u0435\u0439\u043a\u0438 0 \u0442\u043e\u043b\u044c\u043a\u043e \u043e\u0434\u0438\u043d \u0440\u0430\u0437.<\/p>\n<p>  \u0427\u0442\u043e\u0431\u044b \u043f\u0440\u043e\u0432\u0435\u0440\u0438\u0442\u044c \u0432\u0441\u0451 \u043b\u0438 \u043f\u0440\u0430\u0432\u0438\u043b\u044c\u043d\u043e \u0440\u0430\u0431\u043e\u0442\u0430\u0435\u0442 \u0432 \u043c\u043e\u0435\u0439 \u0440\u0435\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u0438 \u0430\u043b\u0433\u043e\u0440\u0438\u0442\u043c\u043e\u0432 cell list \u044f \u0437\u0430\u043e\u0434\u043d\u043e \u043d\u0430\u043f\u0438\u0441\u0430\u043b \u0444\u0443\u043d\u043a\u0446\u0438\u044e, \u0432\u044b\u0447\u0438\u0441\u043b\u044f\u044e\u0449\u0443\u044e \u0432\u0437\u0430\u0438\u043c\u043e\u0434\u0435\u0439\u0441\u0442\u0432\u0438\u044f \u043d\u0430\u0438\u0432\u043d\u044b\u043c \u043e\u0431\u0440\u0430\u0437\u043e\u043c, \u043f\u0440\u043e\u0441\u0442\u043e \u043f\u0435\u0440\u0435\u0431\u0438\u0440\u0430\u044f \u0432\u0441\u0435 \u043f\u0430\u0440\u044b:<\/p>\n<pre><code class=\"cpp\">__global__ void all_pair(cudaMD* md) {     int i, j;     int step = blockDim.x * gridDim.x;     int ex = 0;  \/\/ exit flag     int nAt = md-&gt;nAt;      i = 0;     j = blockIdx.x * blockDim.x + threadIdx.x + 1;     while (1)     {         while (j &gt;= nAt)         {             i++;             if (i &gt;= nAt - 1)             {                 ex = 1;                 break;             }             j = i + 1 + j - nAt;         }         if (ex) break;         global_pair(i, j, iStep, md);         j = j + step;     } }   __device__ void global_pair(int i, int j, cudaMD* md) {     float r, r2, f;     float engCoul = 0;     float engVdw = 0;     cudaVdW* vdw;     int ti, tj;      float dx = md-&gt;xyz[i].x - md-&gt;xyz[j].x;     float dy = md-&gt;xyz[i].y - md-&gt;xyz[j].y;     float dz = md-&gt;xyz[i].z - md-&gt;xyz[j].z;      \/\/ \u043f\u0435\u0440\u0438\u043e\u0434\u0438\u0447\u0435\u0441\u043a\u0438\u0435 \u0433\u0440\u0430\u043d\u0438\u0447\u043d\u044b\u0435 \u0443\u0441\u043b\u043e\u0432\u0438\u044f     if (dx &gt; md-&gt;halfLeng.x)         dx -= md-&gt;leng.x;     else         if (dx &lt; -md-&gt;halfLeng.x)             dx += md-&gt;leng.x;      if (dy &gt; md-&gt;halfLeng.y)         dy -= md-&gt;leng.y;     else         if (dy &lt; -md-&gt;halfLeng.y)             dy += md-&gt;leng.y;      if (dz &gt; md-&gt;halfLeng.z)         dz -= md-&gt;leng.z;     else         if (dz &lt; -md-&gt;halfLeng.z)             dz += md-&gt;leng.z;      r2 = dx * dx + dy * dy + dz * dz;      if (r2 &lt;= md-&gt;r2Real)         {         r = 0.0;         f = 0.0;          ti = md-&gt;types[i];         tj = md-&gt;types[j];          f += real_ewald(r2, r, md-&gt;chProd[ti][tj], md-&gt;alpha, engCoul);          vdw = md-&gt;vdws[ti][tj];         if (vdw != NULL)             if (r2 &lt;= vdw-&gt;r2cut)                    f += vdw-&gt;feng_r(r2, r, vdw, engVdw);           dx *= f;         dy *= f;         dz *= f;          atomicAdd(&(md-&gt;frs[i].x), dx);         atomicAdd(&(md-&gt;frs[j].x), -dx);         atomicAdd(&(md-&gt;frs[i].y), dy);         atomicAdd(&(md-&gt;frs[j].y), -dy);         atomicAdd(&(md-&gt;frs[i].z), dz);         atomicAdd(&(md-&gt;frs[j].z), -dz);          atomicAdd(&(md-&gt;engCoul1), engCoul);         atomicAdd(&(md-&gt;engVdW), engVdw);      } } <\/code><\/pre>\n<p>  \u0420\u0435\u0437\u0443\u043b\u044c\u0442\u0430\u0442\u044b \u0432\u044b\u0447\u0438\u0441\u043b\u0435\u043d\u0438\u0439 \u0441\u043e\u0432\u043f\u0430\u043b\u0438. \u041f\u0440\u0430\u0432\u0434\u0430, \u0432\u0438\u0434\u0438\u043c\u043e, \u0438\u0437-\u0437\u0430 \u0440\u0430\u0437\u043d\u044b\u0445 \u043f\u043e\u0441\u043b\u0435\u0434\u043e\u0432\u0430\u0442\u0435\u043b\u044c\u043d\u043e\u0441\u0442\u0435\u0439 \u043e\u043a\u0440\u0443\u0433\u043b\u0435\u043d\u0438\u0439 \u043a\u043e\u043e\u0440\u0434\u0438\u043d\u0430\u0442\u044b \u0447\u0430\u0441\u0442\u0438\u0446 \u0432 \u043f\u0440\u0435\u0434\u0435\u043b\u0430\u0445 3-\u0433\u043e \u0437\u043d\u0430\u043a\u0430 \u043f\u043e\u0441\u043b\u0435 \u0437\u0430\u043f\u044f\u0442\u043e\u0439 \u043c\u043e\u0433\u0443\u0442 \u0432\u0430\u0440\u044c\u0438\u0440\u043e\u0432\u0430\u0442\u044c\u0441\u044f \u043e\u0442 \u0437\u0430\u043f\u0443\u0441\u043a\u0430 \u043a \u0437\u0430\u043f\u0443\u0441\u043a\u0443. \u0417\u0430\u043c\u0435\u0447\u0443, \u0447\u0442\u043e \u043d\u0430 \u0441\u0438\u0441\u0442\u0435\u043c\u0435 \u043f\u043e\u0440\u044f\u0434\u043a\u0430 1400 \u0447\u0430\u0441\u0442\u0438\u0446 \u0438 \u0440\u0430\u0434\u0438\u0443\u0441\u0430 \u043e\u0431\u0440\u0435\u0437\u0430\u043d\u0438\u044f 6 \u0430\u043d\u0433\u0441\u0442\u0440\u0435\u043c \u0444\u0443\u043d\u043a\u0446\u0438\u0438 <i>cell_list2a <\/i>\u0438 <i>cell_list2b <\/i>\u043f\u0440\u043e\u0438\u0433\u0440\u044b\u0432\u0430\u044e\u0442 \u043f\u043e \u0432\u0440\u0435\u043c\u0435\u043d\u0438 \u0438\u0441\u043f\u043e\u043b\u043d\u0435\u043d\u0438\u044f \u043f\u0440\u043e\u0441\u0442\u043e\u043c\u0443 \u043f\u0435\u0440\u0435\u0431\u043e\u0440\u0443 \u043f\u0440\u0438\u043c\u0435\u0440\u043d\u043e \u0432 \u0434\u0432\u0430 \u0440\u0430\u0437\u0430. \u041f\u0440\u0438 \u043e\u0431\u0440\u0430\u0431\u043e\u0442\u043a\u0435 \u0432 \u0431\u043b\u043e\u043a\u0435 \u0441\u0440\u0430\u0437\u0443 \u043d\u0435\u0441\u043a\u043e\u043b\u044c\u043a\u0438\u0445 \u043f\u0430\u0440 (8 \u0438 16) \u0441\u043a\u043e\u0440\u043e\u0441\u0442\u0438 \u0441\u0440\u0430\u0432\u043d\u0438\u0432\u0430\u044e\u0442\u0441\u044f \u0438 \u043c\u043e\u0433\u0443\u0442 \u0434\u0430\u0436\u0435 \u043d\u0435\u0441\u043a\u043e\u043b\u044c\u043a\u043e \u043e\u043f\u0435\u0440\u0435\u0436\u0430\u0442\u044c \u0444\u0443\u043d\u043a\u0446\u0438\u044e <i>all_pair<\/i>. \u041e\u0434\u043d\u0430\u043a\u043e \u044d\u0442\u043e \u0434\u043e\u043b\u0436\u043d\u043e \u0441\u0438\u043b\u044c\u043d\u043e \u0437\u0430\u0432\u0438\u0441\u0435\u0442\u044c \u043e\u0442 \u0440\u0430\u0437\u043c\u0435\u0440\u043e\u0432 \u0441\u0438\u0441\u0442\u0435\u043c\u044b. \u041f\u0440\u0438 \u0443\u0432\u0435\u043b\u0438\u0447\u0435\u043d\u0438\u0438 \u0447\u0438\u0441\u043b\u0430 \u0430\u0442\u043e\u043c\u043e\u0432 \u0441\u043a\u043e\u0440\u043e\u0441\u0442\u044c \u0430\u043b\u0433\u043e\u0440\u0438\u0442\u043c\u043e\u0432 cell list \u0440\u0430\u0441\u0442\u0435\u0442 \u043b\u0438\u043d\u0435\u0439\u043d\u043e, \u0430 \u043f\u0440\u043e\u0441\u0442\u043e\u0439 \u043f\u0435\u0440\u0435\u0431\u043e\u0440 \u2013 \u043a\u0432\u0430\u0434\u0440\u0430\u0442\u0438\u0447\u043d\u043e. \u041a\u0440\u043e\u043c\u0435 \u0442\u043e\u0433\u043e, cell list \u043e\u0447\u0435\u043d\u044c \u044d\u0444\u0444\u0435\u043a\u0442\u0438\u0432\u0435\u043d \u043f\u0440\u0438 \u043c\u043e\u0434\u0435\u043b\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u0438 \u0440\u0430\u0437\u0440\u044f\u0436\u0435\u043d\u043d\u044b\u0445 \u0441\u0438\u0441\u0442\u0435\u043c (\u0431\u043e\u043b\u044c\u0448\u0438\u0435 \u0440\u0430\u0441\u0441\u0442\u043e\u044f\u043d\u0438\u044f \u043c\u0435\u0436\u0434\u0443 \u0447\u0430\u0441\u0442\u0438\u0446\u0430\u043c\u0438), \u043d\u0430\u043f\u0440\u0438\u043c\u0435\u0440, \u0433\u0430\u0437\u043e\u0432<\/p>\n<h3>\u0417\u0430\u043a\u043b\u044e\u0447\u0435\u043d\u0438\u0435<\/h3>\n<p>  \u041d\u0430 \u044d\u0442\u043e\u043c \u0434\u0430\u043d\u043d\u0443\u044e \u0441\u0442\u0430\u0442\u044c\u044e \u0437\u0430\u043a\u0430\u043d\u0447\u0438\u0432\u0430\u044e, \u0431\u0443\u0434\u0443 \u0440\u0430\u0434 \u043b\u044e\u0431\u044b\u043c \u0432\u043e\u043f\u0440\u043e\u0441\u0430\u043c \u0438 \u043a\u043e\u043c\u043c\u0435\u043d\u0442\u0430\u0440\u0438\u044f\u043c, \u043e\u0441\u043e\u0431\u0435\u043d\u043d\u043e \u043f\u043e \u0443\u0432\u0435\u043b\u0438\u0447\u0435\u043d\u0438\u044e \u043f\u0440\u043e\u0438\u0437\u0432\u043e\u0434\u0438\u0442\u0435\u043b\u044c\u043d\u043e\u0441\u0442\u0438. \u041d\u0430\u0438\u0431\u043e\u043b\u0435\u0435 \u0434\u0438\u0441\u043a\u0443\u0442\u0438\u0432\u043d\u044b\u0435 \u043c\u043e\u043c\u0435\u043d\u0442\u044b \u043f\u043e \u0445\u043e\u0434\u0443 \u043f\u043e\u0432\u0435\u0441\u0442\u0432\u043e\u0432\u0430\u043d\u0438\u044f \u044f \u043e\u0442\u043c\u0435\u0442\u0438\u043b \u043a\u0440\u0430\u0441\u043d\u044b\u043c. \u041f\u043e\u0441\u043a\u043e\u043b\u044c\u043a\u0443 \u043f\u0435\u0440\u0435\u043d\u043e\u0441 \u043e\u0441\u0442\u0430\u043b\u044c\u043d\u043e\u0433\u043e \u0444\u0443\u043d\u043a\u0446\u0438\u043e\u043d\u0430\u043b\u0430 \u043c\u043e\u043b\u0435\u043a\u0443\u043b\u044f\u0440\u043d\u043e\u0439 \u0434\u0438\u043d\u0430\u043c\u0438\u043a\u0438 \u0432\u0441\u0435 \u0440\u0430\u0432\u043d\u043e \u043d\u0430\u0434\u043e \u0434\u0435\u043b\u0430\u0442\u044c, \u044f \u043f\u043b\u0430\u043d\u0438\u0440\u0443\u044e \u043f\u0440\u043e\u0434\u043e\u043b\u0436\u0438\u0442\u044c \u0446\u0438\u043a\u043b \u0434\u0430\u043d\u043d\u044b\u0445 \u0441\u0442\u0430\u0442\u0435\u0439:<\/p>\n<ol>\n<li>\u0421\u0443\u043c\u043c\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u0435 \u043f\u043e \u042d\u0432\u0430\u043b\u044c\u0434\u0443.<\/li>\n<li>\u0412\u043d\u0443\u0442\u0440\u0438\u043c\u043e\u043b\u0435\u043a\u0443\u043b\u044f\u0440\u043d\u043e\u0435 \u0432\u0437\u0430\u0438\u043c\u043e\u0434\u0435\u0439\u0441\u0442\u0432\u0438\u0435.<\/li>\n<li>\u0420\u0430\u0437\u0440\u044b\u0432 \u0438 \u043e\u0431\u0440\u0430\u0437\u043e\u0432\u0430\u043d\u0438\u0435 \u0441\u0432\u044f\u0437\u0435\u0439.<\/li>\n<li>\u042d\u043b\u0435\u043a\u0442\u0440\u043e\u043d\u043d\u044b\u0439 \u043f\u0435\u0440\u0435\u043d\u043e\u0441.<\/li>\n<\/ol>\n<p>  \u0418\u0437 \u043b\u0438\u0442\u0435\u0440\u0430\u0442\u0443\u0440\u044b \u043f\u043e \u041c\u0414 \u043c\u043e\u0433\u0443 \u043f\u043e\u0440\u0435\u043a\u043e\u043c\u0435\u043d\u0434\u043e\u0432\u0430\u0442\u044c \u043a\u043d\u0438\u0433\u0443 <i>Daan Frenkel and Berend Smit<\/i>. <u>\u00abUnderstanding Molecular Simulation: From Algorithms to Applications\u00bb<\/u> \u0438 <u>\u00abComputer Simulation of Liquids\u00bb<\/u> \u0437\u0430 \u0430\u0432\u0442\u043e\u0440\u0441\u0442\u0432\u043e\u043c <i>M.P. Allen, D. J. Tildesley<\/i>. \u0414\u043b\u044f \u043f\u0435\u0440\u0432\u043e\u0439, \u043d\u0430\u0441\u043a\u043e\u043b\u044c\u043a\u043e \u043c\u043d\u0435 \u0438\u0437\u0432\u0435\u0441\u0442\u043d\u043e, \u0441\u0443\u0449\u0435\u0441\u0442\u0432\u0443\u0435\u0442 \u043f\u0435\u0440\u0435\u0432\u043e\u0434 \u043d\u0430 \u0440\u0443\u0441\u0441\u043a\u0438\u0439.<\/p>\n<p>  \u0422\u0430\u043a\u0436\u0435 \u0432\u044b\u0440\u0430\u0436\u0430\u044e \u0431\u043b\u0430\u0433\u043e\u0434\u0430\u0440\u043d\u043e\u0441\u0442\u044c \u041f\u0430\u0432\u043b\u0443 \u041a\u0443\u0434\u0438\u043d\u043e\u0432\u0443 <a href=\"https:\/\/habr.com\/ru\/users\/pavel_kudinov\/\" class=\"user_link\">pavel_kudinov<\/a> \u0437\u0430 \u0435\u0433\u043e \u043a\u043e\u043c\u043c\u0435\u043d\u0442\u0430\u0440\u0438\u0439, \u043f\u0440\u0438\u0437\u044b\u0432\u0430\u044e\u0449\u0438\u0439 \u00ab<a href=\"https:\/\/habr.com\/ru\/company\/epam_systems\/blog\/245503\/#comment_8175221\">\u043f\u0438\u0441\u0430\u0442\u044c GPGPU \u043a\u043e\u0434, \u043f\u0440\u043e\u0441\u0442\u043e\u0439 \u0438 \u043f\u0440\u044f\u043c\u043e\u0439 \u043a\u0430\u043a \u043c\u043e\u043b\u043e\u0442\u043e\u043a<\/a>\u00bb, \u043f\u0440\u043e\u0447\u0438\u0442\u0430\u0432 \u043a\u043e\u0442\u043e\u0440\u044b\u0439, \u044f, \u043d\u0430\u043a\u043e\u043d\u0435\u0446, \u043f\u0435\u0440\u0435\u0448\u0435\u043b \u043a \u0430\u043a\u0442\u0438\u0432\u043d\u044b\u043c \u0434\u0435\u0439\u0441\u0442\u0432\u0438\u044f\u043c, \u0447\u0442\u043e \u0438 \u0432\u044b\u043b\u0438\u043b\u043e\u0441\u044c \u0432 \u044d\u0442\u0443 \u0441\u0442\u0430\u0442\u044c\u044e.<\/div>\n<p> \u0441\u0441\u044b\u043b\u043a\u0430 \u043d\u0430 \u043e\u0440\u0438\u0433\u0438\u043d\u0430\u043b \u0441\u0442\u0430\u0442\u044c\u0438 <a href=\"https:\/\/habr.com\/ru\/post\/508396\/\"> https:\/\/habr.com\/ru\/post\/508396\/<\/a><\/p>\n","protected":false},"excerpt":{"rendered":"\n<div class=\"post__text post__text-html post__text_v1\" id=\"post-content-body\" data-io-article-url=\"https:\/\/habr.com\/ru\/post\/508396\/\">\u0426\u0435\u043b\u044c \u0434\u0430\u043d\u043d\u043e\u0439 \u0441\u0442\u0430\u0442\u044c\u0438 \u2013 \u043f\u043e\u0434\u043d\u044f\u0442\u044c \u0432\u043e\u043f\u0440\u043e\u0441\u044b \u0440\u0430\u0441\u043f\u0430\u0440\u0430\u043b\u043b\u0435\u043b\u0438\u0432\u0430\u043d\u0438\u044f \u043a\u043e\u0434\u0430 \u043f\u0440\u043e\u0433\u0440\u0430\u043c\u043c\u044b \u0434\u043b\u044f \u0447\u0438\u0441\u043b\u0435\u043d\u043d\u043e\u0433\u043e \u043c\u043e\u0434\u0435\u043b\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u044f \u043c\u0435\u0442\u043e\u0434\u043e\u043c \u043c\u043e\u043b\u0435\u043a\u0443\u043b\u044f\u0440\u043d\u043e\u0439 \u0434\u0438\u043d\u0430\u043c\u0438\u043a\u0438 (\u041c\u0414) \u0441 \u043f\u043e\u043c\u043e\u0449\u044c\u044e \u0442\u0435\u0445\u043d\u043e\u043b\u043e\u0433\u0438\u0438 CUDA. \u0417\u0430\u0447\u0435\u043c \u044d\u0442\u043e \u0432\u043e\u043e\u0431\u0449\u0435 \u043d\u0443\u0436\u043d\u043e, \u0432\u0435\u0434\u044c \u0443\u0436\u0435 \u0441\u0443\u0449\u0435\u0441\u0442\u0432\u0443\u044e\u0442 \u043f\u0440\u043e\u0433\u0440\u0430\u043c\u043c\u043d\u044b\u0435 \u043f\u0430\u043a\u0435\u0442\u044b \u043f\u043e \u041c\u0414, \u0440\u0430\u0431\u043e\u0442\u0430\u044e\u0449\u0438\u0435 \u0432 \u0442\u043e\u043c \u0447\u0438\u0441\u043b\u0435 \u0438 \u043d\u0430 CUDA? \u0414\u0435\u043b\u043e \u0432 \u0442\u043e\u043c, \u0447\u0442\u043e \u044f \u0440\u0430\u0437\u0432\u0438\u0432\u0430\u044e \u0441\u0432\u043e\u044e \u0441\u043e\u0431\u0441\u0442\u0432\u0435\u043d\u043d\u0443\u044e \u043a\u043e\u043d\u0446\u0435\u043f\u0446\u0438\u044e \u00ab\u043d\u0435\u043f\u043e\u0441\u0442\u043e\u044f\u043d\u043d\u043e\u0433\u043e \u043f\u043e\u043b\u044f \u0441\u0438\u043b\u00bb (non-constant force field), \u043a\u043e\u0442\u043e\u0440\u0430\u044f \u043d\u0435 \u0440\u0435\u0430\u043b\u0438\u0437\u043e\u0432\u0430\u043d\u0430 \u0432 \u0441\u0443\u0449\u0435\u0441\u0442\u0432\u0443\u044e\u0449\u0438\u0445 \u041c\u0414-\u043f\u0440\u043e\u0433\u0440\u0430\u043c\u043c\u0430\u0445. <\/p>\n<p>  \u041f\u0435\u0440\u0435\u0434\u0435\u043b\u044b\u0432\u0430\u0442\u044c \u0447\u0443\u0436\u043e\u0439 \u043a\u043e\u0434 \u043f\u043e\u0434 \u044d\u0442\u0438 \u043d\u0443\u0436\u0434\u044b \u2013 \u0434\u043e\u0432\u043e\u043b\u044c\u043d\u043e \u043d\u0435\u0431\u043b\u0430\u0433\u043e\u0434\u0430\u0440\u043d\u043e\u0435 \u0437\u0430\u043d\u044f\u0442\u0438\u0435, \u043f\u043e\u044d\u0442\u043e\u043c\u0443 \u044f \u0432\u0437\u044f\u043b\u0441\u044f \u043f\u0435\u0440\u0435\u043d\u0435\u0441\u0442\u0438 \u0443\u0436\u0435 \u043d\u0430\u043f\u0438\u0441\u0430\u043d\u043d\u044b\u0439 \u0441\u0432\u043e\u0439 \u043f\u043e\u0441\u043b\u0435\u0434\u043e\u0432\u0430\u0442\u0435\u043b\u044c\u043d\u044b\u0439 \u043a\u043e\u0434 \u0438 \u0437\u0430\u043e\u0434\u043d\u043e \u043f\u043e\u0434\u0435\u043b\u0438\u0442\u0441\u044f \u043d\u0435\u043a\u043e\u0442\u043e\u0440\u044b\u043c\u0438 \u0440\u0430\u0437\u043c\u044b\u0448\u043b\u0435\u043d\u0438\u044f\u043c\u0438. \u041a\u0440\u043e\u043c\u0435 \u0442\u043e\u0433\u043e, \u044d\u0442\u043e \u043e\u0442\u0432\u0435\u0442 \u043d\u0430 \u0447\u0430\u0441\u0442\u043e \u043c\u0435\u043b\u044c\u043a\u0430\u044e\u0449\u0438\u0439 \u0437\u0434\u0435\u0441\u044c \u043a\u043e\u043c\u043c\u0435\u043d\u0442\u0430\u0440\u0438\u0439 \u043a \u0441\u0442\u0430\u0442\u044c\u044f\u043c \u043f\u043e CUDA, \u0432\u0440\u043e\u0434\u0435 <a href=\"https:\/\/habr.com\/ru\/company\/epam_systems\/blog\/245503\/#comment_8173777\">\u044d\u0442\u043e\u0433\u043e <\/a>.<\/p>\n<p>  \u0418\u0442\u0430\u043a, \u0447\u0442\u043e \u0436\u0435 \u0442\u0430\u043a\u043e\u0435 \u043c\u043e\u043b\u0435\u043a\u0443\u043b\u044f\u0440\u043d\u0430\u044f \u0434\u0438\u043d\u0430\u043c\u0438\u043a\u0430? \u041d\u0430 \u0425\u0430\u0431\u0440\u0435 \u0443\u0436\u0435 \u0435\u0441\u0442\u044c \u043d\u0435\u0441\u043a\u043e\u043b\u044c\u043a\u043e \u043f\u043e\u0441\u0442\u043e\u0432 \u043d\u0430 \u044d\u0442\u0443 \u0442\u0435\u043c\u0443, \u043d\u0430\u043f\u0440\u0438\u043c\u0435\u0440 <a href=\"https:\/\/habr.com\/ru\/post\/377845\/\">\u0437\u0434\u0435\u0441\u044c <\/a> \u0438\u043b\u0438 \u0432\u043e\u0442 <a href=\"https:\/\/habr.com\/ru\/post\/111413\/\">\u0437\u0434\u0435\u0441\u044c<\/a>. \u041a\u0440\u0430\u0442\u043a\u043e, \u041c\u0414 \u2013 \u044d\u0442\u043e \u043c\u0435\u0442\u043e\u0434, \u043f\u043e\u0437\u0432\u043e\u043b\u044f\u044e\u0449\u0438\u0439 \u043c\u043e\u0434\u0435\u043b\u0438\u0440\u043e\u0432\u0430\u0442\u044c \u0434\u0432\u0438\u0436\u0435\u043d\u0438\u0435 \u043c\u043d\u043e\u0436\u0435\u0441\u0442\u0432\u0430 \u0447\u0430\u0441\u0442\u0438\u0446 (\u0432 \u0442\u043e\u043c \u0447\u0438\u0441\u043b\u0435 \u0430\u0442\u043e\u043c\u043e\u0432, \u0438\u043e\u043d\u043e\u0432, \u043c\u043e\u043b\u0435\u043a\u0443\u043b) \u0438 \u0440\u0430\u0441\u0441\u0447\u0438\u0442\u044b\u0432\u0430\u0442\u044c \u043a\u043e\u043b\u043b\u0435\u043a\u0442\u0438\u0432\u043d\u044b\u0435 \u0441\u0432\u043e\u0439\u0441\u0442\u0432\u0430 \u0441\u0438\u0441\u0442\u0435\u043c\u044b, \u0437\u0430\u0432\u0438\u0441\u044f\u0449\u0438\u0435 \u043e\u0442 \u044d\u0442\u043e\u0433\u043e \u0434\u0432\u0438\u0436\u0435\u043d\u0438\u044f. \u041a\u0430\u043a \u044d\u0442\u043e \u0440\u0430\u0431\u043e\u0442\u0430\u0435\u0442? \u0414\u043e\u043f\u0443\u0441\u0442\u0438\u043c \u0434\u043b\u044f \u043c\u043d\u043e\u0436\u0435\u0441\u0442\u0432\u0430 \u0438\u0437 N \u0447\u0430\u0441\u0442\u0438\u0446 \u0437\u0430\u0434\u0430\u043d\u044b \u043d\u0435\u043a\u043e\u0442\u043e\u0440\u044b\u0435 \u043d\u0430\u0447\u0430\u043b\u044c\u043d\u044b\u0435 \u043a\u043e\u043e\u0440\u0434\u0438\u043d\u0430\u0442\u044b, \u0441\u043a\u043e\u0440\u043e\u0441\u0442\u0438, \u043c\u0430\u0441\u0441\u044b \u0438 (\u0433\u043b\u0430\u0432\u043d\u043e\u0435!) \u0437\u0430\u043a\u043e\u043d\u044b \u0432\u0437\u0430\u0438\u043c\u043e\u0434\u0435\u0439\u0441\u0442\u0432\u0438\u044f \u043c\u0435\u0436\u0434\u0443 \u043d\u0438\u043c\u0438. \u0418\u0437\u043c\u0435\u043d\u044f\u0435\u043c \u043a\u043e\u043e\u0440\u0434\u0438\u043d\u0430\u0442\u044b \u0441\u043e\u0433\u043b\u0430\u0441\u043d\u043e \u0441\u043a\u043e\u0440\u043e\u0441\u0442\u044f\u043c. \u041d\u0430 \u043e\u0441\u043d\u043e\u0432\u0435 \u0437\u0430\u043a\u043e\u043d\u043e\u0432 \u0432\u0437\u0430\u0438\u043c\u043e\u0434\u0435\u0439\u0441\u0442\u0432\u0438\u044f \u0432\u044b\u0447\u0438\u0441\u043b\u044f\u0435\u043c \u0441\u0438\u043b\u044b, \u0434\u0435\u0439\u0441\u0442\u0432\u0443\u044e\u0449\u0438\u0435 \u043c\u0435\u0436\u0434\u0443 \u0447\u0430\u0441\u0442\u0438\u0446\u0430\u043c\u0438. \u0420\u0430\u0437 \u0437\u043d\u0430\u0435\u043c \u0441\u0438\u043b\u0443 \u0438 \u043c\u0430\u0441\u0441\u0443 \u2013 \u0437\u043d\u0430\u0435\u043c \u0443\u0441\u043a\u043e\u0440\u0435\u043d\u0438\u0435. \u041f\u043e\u043f\u0440\u0430\u0432\u043b\u044f\u0435\u043c \u0441\u043a\u043e\u0440\u043e\u0441\u0442\u044c \u0441 \u0443\u0447\u0435\u0442\u043e\u043c \u0443\u0441\u043a\u043e\u0440\u0435\u043d\u0438\u044f. \u0418 \u0441\u043d\u043e\u0432\u0430 \u043f\u0435\u0440\u0435\u0445\u043e\u0434\u0438\u043c \u043a \u0438\u0437\u043c\u0435\u043d\u0435\u043d\u0438\u044e \u043a\u043e\u043e\u0440\u0434\u0438\u043d\u0430\u0442. \u0418 \u0442\u0430\u043a \u043f\u043e\u0432\u0442\u043e\u0440\u044f\u0435\u043c \u0442\u044b\u0441\u044f\u0447\u0438 \u0440\u0430\u0437, \u043f\u043e\u043a\u0430 <s>\u043d\u0435 \u043d\u0430\u0434\u043e\u0435\u0441\u0442<\/s> \u043d\u0435 \u043d\u0430\u0431\u0435\u0440\u0435\u043c \u0434\u043e\u0441\u0442\u0430\u0442\u043e\u0447\u043d\u0443\u044e \u0441\u0442\u0430\u0442\u0438\u0441\u0442\u0438\u043a\u0443.<\/p>\n<p>  <img decoding=\"async\" src=\"https:\/\/spectrum.ieee.org\/image\/MzU5MTAwMA.jpeg\" alt=\"image\"\/>  <\/p>\n","protected":false},"author":1,"featured_media":0,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[],"tags":[],"class_list":["post-305990","post","type-post","status-publish","format-standard","hentry"],"_links":{"self":[{"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=\/wp\/v2\/posts\/305990","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=%2Fwp%2Fv2%2Fcomments&post=305990"}],"version-history":[{"count":0,"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=\/wp\/v2\/posts\/305990\/revisions"}],"wp:attachment":[{"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=%2Fwp%2Fv2%2Fmedia&parent=305990"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=%2Fwp%2Fv2%2Fcategories&post=305990"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=%2Fwp%2Fv2%2Ftags&post=305990"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}