- 01
- 02
- 03
- 04
- 05
- 06
- 07
- 08
- 09
- 10
- 11
- 12
- 13
- 14
- 15
- 16
- 17
- 18
- 19
- 20
- 21
- 22
- 23
- 24
- 25
- 26
- 27
- 28
- 29
- 30
- 31
- 32
- 33
- 34
- 35
- 36
- 37
//библиотеки cuda_runtime.h и device_launch_parameters.h
//для работы с cyda
#include "cuda_runtime.h"
#include "device_launch_parameters.h"
#include<vector>
#include<string>//для getline
#include <stdio.h>
#include<fstream>
using namespace std;
__global__ void Upload_to_GPU(unsigned long long *Number,unsigned long long *Stepn, bool *Stop,unsigned long long *INPUT,unsigned long long *max) {
int thread = threadIdx.x;
unsigned long long MAX_DEGREE_OF = max[0];
int X = thread;
unsigned long long Calculated_number = 1;
unsigned long long Current_degree_of_number = 2;
unsigned long long Original_numberP = INPUT[0];
Stop[thread] = false;
bool BREAK = false;
if (X!=0&&X!=1) {
while (!BREAK) {
if (Current_degree_of_number <= MAX_DEGREE_OF) {
Calculated_number = 1;
for (int counter = 0; counter < Current_degree_of_number; counter++) {
Calculated_number *=X;
}
if (Calculated_number == Original_numberP) {
Stepn[thread] = Current_degree_of_number;
Number[thread] = X;
Stop[thread] = true;
BREAK = true;
}
Current_degree_of_number++;
}
else { BREAK = true; }
}
}
}
gost 31.10.2020 18:13 # 0
gost 31.10.2020 18:14 # 0
guest8 31.10.2020 18:42 # +2
gost 31.10.2020 18:49 # +2
P. S. Перевёл алгоритм автора на «Python» с «Numba», третий с конца результат, который у него считался 16 секунд, вычислил за 65.
…миллисекунд.
guest8 31.10.2020 18:52 # −1
bormand 31.10.2020 21:31 # +3
Мда. Выебать преждевременного оптимизатора наивным кодом на питоне - это бесценно.
guest8 31.10.2020 21:33 # +4
gost 31.10.2020 21:36 # +2
guest8 31.10.2020 21:38 # −1
gost 31.10.2020 21:46 # +1
Без «JIT» ВМ Питона просто берёт вот эти вот опкоды и тупо их исполняет до победного в одном внутреннем евале.
UPD: Только сейчас заметил: он же в самом горячем месте цикла делает LOAD_GLOBAL, то есть идёт в словарь и ищет в нём глобалку по имени. Какой анскилл )))
bormand 31.10.2020 22:13 # 0
Saehrimnir 01.11.2020 08:16 # 0
rotoeb 01.11.2020 08:20 # 0
А явисты, <как> долбоёбы, ставят буковку "f" после дробных чисел )))
gost 31.10.2020 19:54 # +1
И ни один петух не заметил, что для CPU-bound задачи цыплёнок запускает 1000 потоков…
guest8 31.10.2020 19:56 # −999
bormand 31.10.2020 19:58 # 0
guest8 31.10.2020 20:01 # −999
bormand 31.10.2020 20:02 # 0
З.Ы. Я код не читал если что, там много буков.
bormand 31.10.2020 20:14 # 0
gost 31.10.2020 20:25 # 0
bormand 31.10.2020 20:26 # +1
По модулю 2**64?
gost 31.10.2020 20:31 # +1
Показалось сначала, что по модулю UB. Какой багор )))
bormand 31.10.2020 21:02 # 0
Дождаться пока все треды на gpu закончат и пробежаться по массиву в 4 килобайта - не такая уж тяжёлая задача для cpu (на входе массив нинужен т.к. номер треда можно заюзать). Параллелится этот брутфорс вроде неплохо, память не напрягает (не то чтобы не было более красивого решения без брутфорса).
bormand 31.10.2020 21:12 # 0
gost 31.10.2020 21:34 # 0
> ось не будет контекст сильно часто переключать
Я недавно ради интереса одну CPU-bound задачку распараллелил на 4 потока (чтобы все ядра забить), померял, добавил ещё один и получил просадку в полтора раза. Добавил ещё то ли два, то ли три — просело во что-то вроде десяти раз. Так что не всё так однозначно (да и по заверениям автора, у него во время работы CPU-версии проц был загружен на 85%, лол).
Ну и как бы вся задача — это несколько миллионов умножений, это считается реально за миллисекунды, если, конечно, считать, а не ебать планировщик.
guest8 31.10.2020 21:39 # −999
bormand 31.10.2020 21:42 # 0
На cpu нету. А вот на gpu есть. Там шедулер намного тоньше, другие треды смогут поработать пока первая группа ответ от памяти ждёт.
guest8 31.10.2020 21:45 # −999
bormand 31.10.2020 21:48 # 0
guest8 31.10.2020 21:50 # −999
bormand 31.10.2020 21:57 # 0
Вроде гипертреды стараются отдавать тредам одного процесса. Чтобы они могли "share TLBs and L1 caches" а не мешаться друг другу.
guest8 31.10.2020 22:01 # −999
bormand 31.10.2020 22:02 # 0
guest8 31.10.2020 22:06 # −999
guest8 01.11.2020 03:13 # −999
bormand 31.10.2020 21:23 # +2
guest8 31.10.2020 21:47 # −999
bormand 31.10.2020 21:49 # 0
CHayT 31.10.2020 22:13 # 0
guest8 01.11.2020 03:05 # −999
bormand 02.11.2020 02:34 # 0
Но у gpu очень специфичная архитектура и как попало под неё писать нельзя, иначе все терафлопсы вылетят в трубу. Сложный код, где много переменных, много нелокальных обращений к памяти, циклы переменной длины с внезапными бряками и т.п. видюхи очень плохо переносят. Им нужны тысячи и миллионы простых, независимых, однообразных задач.
guest8 02.11.2020 02:42 # −999
bormand 02.11.2020 03:01 # 0
Всё хуже. "Треды" исполняются группами по 16 штук, по сути это SIMD. Сам понимаешь, что control flow у них один на всех. Поэтому пока половина исполняет then, вторая пинает хуи. А потом наоборот. Ну и выйти из цикла они могут только всей группой.
А у памяти большое латенси и маленькие кеши, что-то в духе сотни килобайт на "тыщу ядер" (один мультипроцессор). Поэтому рандомный доступ куда попало очень дорого обходится.
Ну и регистры статически распределяются, поэтому чем больше переменных - тем меньше тредов ты сможешь загнать на однин мультипроцессор.
guest8 02.11.2020 03:18 # −999
bormand 02.11.2020 03:22 # 0
guest8 02.11.2020 03:25 # −999
bormand 02.11.2020 03:28 # 0
guest8 02.11.2020 03:30 # −999
bormand 02.11.2020 03:50 # 0
С некогерентными L1 кешами видеокарт это вообще пиздецом попахивает...
guest8 02.11.2020 03:52 # −999
bormand 02.11.2020 04:10 # 0
guest6 03.05.2024 01:41 # 0
guest8 02.11.2020 02:48 # −999
j123123 02.11.2020 02:54 # 0
guest8 02.11.2020 02:56 # −999
bormand 02.11.2020 03:03 # 0
З.Ы. Можно и int m_foo = 12; если кресты свежие. Но с const'ом это не имеет особого смысла, только память зря тратить. Зачем тебе поле в котором всегда одно и то же?
guest8 02.11.2020 03:07 # −999
bormand 02.11.2020 03:09 # 0
guest8 02.11.2020 03:10 # −999
bormand 02.11.2020 03:13 # 0
У объектов сработает дефолтный конструктор, а потом ты в них присвоишь новое значение. Реальная проблема только если дефолтный конструктор тяжёлый, с побочками или его вообще нет. Но такого на практике почти не бывает.
guest8 02.11.2020 03:15 # −999
bormand 02.11.2020 03:31 # 0
Ну дык, это как машина с ручной коробкой. Не хочешь думать - юзай джаву.
guest8 02.11.2020 03:38 # −999
bormand 02.11.2020 03:44 # +1
Это да. Я вот вижу, что в питоне какое-то поведение не описано в доке. И вообще не юзаю его. А питонисты говорят: "чувак, да просто запусти и посмотри что будет".
guest8 02.11.2020 03:48 # +1
bormand 02.11.2020 03:15 # 0
Оператор мувающего присваивания прикрути ему. По аналогии с мув конструктором.
guest8 02.11.2020 03:16 # +1
j123123 02.11.2020 17:05 # 0
У кого-то остались бэкапы всего того, что было насрано через guest8?
gost 02.11.2020 17:07 # 0
OCETuHCKuu_nemyx 02.11.2020 13:46 # 0