Render.ru

Нужна помошь знатоков по векторным операциям

4i4ikov

Знаток
Рейтинг
37
#21
Не повезло, у меня тоже 2600к. Стоит правда без буста (чтоб ноги просто так не грел :) )

3.4 гц
-------------------- bench 100000
Dark (vector): 0.375
4i4ikov (scalar): 0.707000017166
Dark (vector): 0.358999967575
4i4ikov (scalar): 0.68799996376
Вот в том то и юмор, что по оному ядру и без разгона 2600k не отличается от древней корки под разгоном, которую маркетологи вообще пентиумом назвали. А теперь сравним их цены, такую корку сейчас на барахолке можно за 500р взять)). Это если комп нужен для интернета и кино смотреть.
А i7 я специально под разгон брал, рендерилку на нем собрал. Ядро не сильно горячее, очень хорошая архитектура.

Вот бы кто на amd померил, на FX-ах например.
 

Andots

Знаток
Рейтинг
66
#22
Это точно. Ну правда я не думаю что питон использует какие то новые инструкции и кеш проца, все таки I7 этим и отличается от старых. Потому наверно и разница небольшая. А так да ,проц хороший и не сильно отстает от новый i7 , смешно то что я его брал за 9,5к а новые сейчас стоят по 50-60к


Кста. Ради интереса загони строчку

import maya.api.OpenMaya as Om

def maya_useNewAPI():

pass

и запусти тест еще раз.
У меня возможно в первый раз просто комп чем то развлекался но второй раз чутка побырей.


-------------------- bench 100000
Dark (vector): 0.343999862671
4i4ikov (scalar): 0.672000169754
Dark (vector): 0.343999862671
4i4ikov (scalar): 0.656000137329
 

4i4ikov

Знаток
Рейтинг
37
#23
Без измений и там и там, maya_useNewAPI() это же для плагинов вроде как, мы же тестим не плагином

А без maya_useNewAPI, если после запустить, что разница большая? Сперва с maya_useNewAPI, потом без.
 

4i4ikov

Знаток
Рейтинг
37
#24
Это из-за авторазгона у тебя могла быть разница между замерами. Если другие ядра пустые он разгоняет одно до 3.8, а в первом случае в других ядрах что-то плескалось. Возможно так.
 

Andots

Знаток
Рейтинг
66
#25
Да не, понятно что для плагинов это, прочитал естественно. Просто ради интереса загнал, я к тому моменту по сути уже обутый стоял и торопился свалить, проверять без этой def времени не было да и майку закрыл уже, потому и написал быренько. Авторазгон у меня залочен, я его без особой надобности (особенно летом) не включаю. В майке он при простое или разовых операциях то не критичен, но если решишь порубать во что нить то за 3-4 лишних fps (которые нафиг не нужны) приходится платить тем что обогрев ног идет приличный (блок под столом) а в комнате и так сейчас 32 по цельсию. Потому turboboost у меня всегда по умолчанию выключен, врубаю при необходимости. Скорей всего просто при первом тесте камень был чем то занят посторонним. Смысл жизни к примеру пытался найти.
 
Последнее редактирование:

4i4ikov

Знаток
Рейтинг
37
#26
Заметил что можно сделать совершенно дичайшую оптимизацию (то что утром написал - удалил, тогда ещё не врубился до конца).

Дикость в том, что length() считает квадратный корень, а потом мы обратно считаем квадраты. И дикость номер два - квадрат длины вектора это скалярное произведение самого на себя.

Таким образом можно вообще избавиться от length() !!!

и вместо старых функций:
Код:
def vectorTest_4i4ikov(v1,v2,v3):
    a = Om.MVector(v1-v3).length()
    b = Om.MVector(v2-v3).length()
    c = Om.MVector(v2-v1).length()
    k = (a*a - b*b)/(2*c*c) + 0.5
    return v2*k+v1*(1-k)

def vectorTest_Dark(v1,v2,v3):
    v21 = v2-v1
    d = Om.MVector(v21).length()
    return v1+(v3-v1)*v21*v21/(d*d)
теперь будет такой шикардос:
Код:
def vectorTest_4i4ikov(v1,v2,v3):
	v21 = v2-v1
	v13 = v1-v3
	v23 = v2-v3
	k = ((v13*v13)-(v23*v23))/(2*v21*v21) + 0.5
	return v2*k+v1*(1-k)
	
def vectorTest_Dark(v1,v2,v3):
	v21 = v2-v1
	return v1+(v3-v1)*v21*v21/(v21*v21)
И новые замеры:
Код:
-------------------- check
Dark    (vector): (-0.0880312, -1.07038, -1.59508)
4i4ikov (scalar): (-0.0880312, -1.07038, -1.59508)
-------------------- bench 100000
Dark    (vector): 0.219000101089
4i4ikov (scalar): 0.280999898911
Dark    (vector): 0.234999895096
4i4ikov (scalar): 0.297000169754
а было:
Код:
-------------------- bench 100000
Dark    (vector): 0.391000032425
4i4ikov (scalar): 0.766000032425
Dark    (vector): 0.390000104904
4i4ikov (scalar): 0.734000205994
В старых замерах вообще смысла мало было, потому что там по сути замерялась функция length() как самая прожорливая.

пысы:
Интересно, можно ли ещё упростить:
v1+(v3-v1)*v21*v21/(v21*v21)
 

Andots

Знаток
Рейтинг
66
#27
Изящно , что говорить, очень изящно. Респект :) Если бы разработчики програмного обеспечения так бы дотошно подходили к своим обязанностям, думаю нынешние проги и плаги в подобном варианте работали бы как минимум в 2 раза быстрее.
 

4i4ikov

Знаток
Рейтинг
37
#28
Да ладно хвалить-то, на самом деле это можно было с самого начала заметить. Хорошая мысля, как известно, приходит опосля ))
 

Andots

Знаток
Рейтинг
66
#29
Ну при чем здесь хвалить, как минимум до этого докопаться и заметить , это уже нужно обладать определенным складом ума. Ну а касаемо питона ,и майкой Апи на нем, у меня свое мнение. Мне кажется что разрабы все таки не позиционируют питон как язык для написания нод или плагинов. По большому счету это некая замена MEl, а в этом случае скорость не суть как важна. Потому и не пытаются добиться максимальной производительности. Все серьезные плаги пишутся на c++. Недавно ради интереса скачал с клаша jscollisiondeformer (на питоне) .. На моей модели в жалких 30к полигонов он залагал так что невозможно было вообще что то сделать. При учете что это фейковая динамика которая просто раздувает геметрию в местах колиизий, просто ужостььь. У меня на этой же модели ncloth с реальной симуляцией работает раз в 20 быстрее. И о чем тут говорить, питон язык ( в майском варианте) скриптов и простеньких плагинов.
 

4i4ikov

Знаток
Рейтинг
37
#30
Это да, переписывание плагинов с питона на cpp - вынужденный процесс, когда скорость работы становится не адекватной. Ускорение будет, я сам практически с этим не сталкивался, но со стороны процесс переписывания наблюдал, естественно быстрее стало. Ну и оптимизация важна, что на питоне, что на плюсах. А так, по мелочи, какие-то элементы можно потестить и на питоне, а полностью писать уже на cpp.
 

4i4ikov

Знаток
Рейтинг
37
#31
А, смотрю что-то знакомое, да, видел его.
Есть же подобный на cpp - stretchMesh, да ещё в исходниках, ковырял его давно, там ошибки были и оптимизацию делал, да так и не доковырял, отложил на потом. Он ещё и многоядерный.
https://github.com/redpawfx/stretchMesh

 

Andots

Знаток
Рейтинг
66
#32
Спс. Надо будет ради интереса поковырять, посмотреть как устроен. Лишним не будет.
 

Andots

Знаток
Рейтинг
66
#33
А поковыряйка вот это ради интереса. Это твоя первая версия замерялки(без исправлений) но с небольшим апгрейдом (вроде как трединг) Интересно получилось, вектора чутка замедлились, но скаляры почти в 2 раза ускорились. Сейчас убегать надо недоковырял немного. Но мож тебе будет интересно.

Код:
import maya.api.OpenMaya as Om
import maya.cmds as m
import maya.utils as u

def vectorTest_4i4ikov(v1,v2,v3):
    a = Om.MVector(v1-v3).length()
    b = Om.MVector(v2-v3).length()
    c = Om.MVector(v2-v1).length()
    k = (a*a - b*b)/(2*c*c) + 0.5
    return v2*k+v1*(1-k)

def vectorTest_Dark(v1,v2,v3):
    v21 = v2-v1
    d = Om.MVector(v21).length()
    return v1+(v3-v1)*v21*v21/(d*d)

import time
class new_Bench:
    mera = time.time
    #mera = time.clock
    def __init__(self):
        self.time=self.mera()
    def reset(self):
        self.__init__()
    def get(self):
        self.time = self.mera() - self.time
        return self.time

v1 = Om.MVector(5.111 , -2.046, -1.956)
v2 = Om.MVector(-5.419 , -0.070 , -1.225)
v3 = Om.MVector( -0.246 , 0 , -6.764)
print '\n','-'*20,'check'
print 'Dark    (vector):',vectorTest_Dark(v1,v2,v3)
print '4i4ikov (scalar):',vectorTest_4i4ikov(v1,v2,v3)

Bench = new_Bench()
N = 100000
print '\n','-'*20,'bench',N

Bench.reset()
for i in xrange(1,N): u.executeDeferred("vectorTest_Dark(v1/i,v2/i,v3/i)")
print 'Dark    (vector):',Bench.get()

Bench.reset()
for i in xrange(1,N): u.executeDeferred("vectorTest_4i4ikov(v1/i,v2/i,v3/i)")
print '4i4ikov (scalar):',Bench.get()

Bench.reset()
for i in xrange(1,N): u.executeDeferred("vectorTest_Dark(v1/i,v2/i,v3/i)")
print 'Dark    (vector):',Bench.get()

Bench.reset()
for i in xrange(1,N): u.executeDeferred("vectorTest_4i4ikov(v1/i,v2/i,v3/i)")
print '4i4ikov (scalar):',Bench.get()
И еще вот этот пример погляди.
Код:
import maya.cmds as cmds
import maya.utils as utils
import threading

def do_in_main():
    utils.executeDeferred (cmds.sphere)

for i in range(10):
    t  = threading.Thread(target=do_in_main, args=())
    t.start()
 
Последнее редактирование:

4i4ikov

Знаток
Рейтинг
37
#34
А поковыряйка вот это ради интереса. Это твоя первая версия замерялки(без исправлений) но с небольшим апгрейдом (вроде как трединг) Интересно получилось, вектора чутка замедлились, но скаляры почти в 2 раза ускорились. Сейчас убегать надо недоковырял немного. Но мож тебе будет интересно.
Ааа, многояйцевость хочешь прикрутить.
В общем трейды в питоне они все на одном яйце выполняются, это просто одновременное выполнение потоков.

executeDeferred это отложенное выполнение, оно ждёт момента когда майя простаивает. В итоге ещё хуже с тестом получется, замеры он написал у меня у всех одинаковые 0.4 секунды, но потом долго висит, потому что считает. И так как они все четыре пущены на отложенное выполнение, они толпятся и друг другу мешают. Надо одного запускать по executeDeferred, остальных нормально, так правильнее, но смысла в этом нет.

И если увеличить число проходов в 10 раз до N = 1000000, то нажинает жраться память а потом всё ещё дольше считает. То есть он сперва всё подготовил все возможные вызовы в памяти, выдал результат времени кэширования(бенчмарк показал уже замеры), а потом в фоновом режиме начинет считать.

Многояйцевость сидит в multiprocessing, а он не работает.
Эти все вещи нарушают архитектуру, если они даже по тредингу пишут:
Maya API and Maya Command architectures are not thread-safe. Maya commands throw an exception if they are called outside the main thread, and use of the OpenMaya API from threads other than the main one has unforeseen side effects.

Но вот чисто питоновские вычисления могли бы совершенно безопасно работать на многоядерности, вот это надо копать, как полечить multiprocessing.

upd
Удалил про multithreading, нет такого модуля, это общее название для threading.
 
Последнее редактирование:

Andots

Знаток
Рейтинг
66
#35
:Crying2:
Ааа, многояйцевость хочешь прикрутить.
В общем трейды в питоне они все на одном яйце выполняются, это просто одновременное выполнение потоков.

executeDeferred это отложенное выполнение, оно ждёт момента когда майя простаивает. В итоге ещё хуже с тестом получется, замеры он написал у меня у всех одинаковые 0.4 секунды, но потом долго висит, потому что считает. И так как они все четыре пущены на отложенное выполнение, они толпятся и друг другу мешают. Надо одного запускать по executeDeferred, остальных нормально, так правильнее, но смысла в этом нет.

И если увеличить число проходов в 10 раз до N = 1000000, то нажинает жраться память а потом всё ещё дольше считает. То есть он сперва всё подготовил все возможные вызовы в памяти, выдал результат времени кэширования(бенчмарк показал уже замеры), а потом в фоновом режиме начинет считать.

Многояйцевость сидит в multiprocessing, а он не работает. Есть ещё multithreading, не проверял, но тоже скорее всего не заработает.
Эти все вещи нарушают архитектуру, если они даже по тредингу пишут:
Maya API and Maya Command architectures are not thread-safe. Maya commands throw an exception if they are called outside the main thread, and use of the OpenMaya API from threads other than the main one has unforeseen side effects.

Но вот чисто питоновские вычисления могли бы совершенно безопасно работать на многоядерности, вот это надо копать, как полечить multiprocessing.
:Crying2: Вотжеш блин, а счастье казалось так близко. Взял и испортил всю малину:D. У меня тоже в конце подвисло, но подумал что просто не так что то сделал. Мдя, конеш в 2016м считать на одном ядре это почти порнография. Остается ждать когда в майский питон притопчет многоядерность, лезть в cpp боюсь,я в нем 0 без палочки и чую пока научусь внуки в школу пойдут. Хотя я еще месяца 4 назад и питон то вообще по сути не знал, но их сравнивать глупо.
 

4i4ikov

Знаток
Рейтинг
37
#36
Остается ждать когда в майский питон притопчет многоядерность
Никогда не притопчет, нарушает архитектуру это, самим надо прикручивать, это чисто с настройками питона ковыряться, у меня есть мысли как это делать, потом займусь, может чёнить получится. Пока делаю через внешние вызовы, как говорил уже, через os.system, а там уже запускаю многопрессинг.

С тредингом не ты первый обломался)) обманчивое название.
 

Andots

Знаток
Рейтинг
66
#37
Никогда не притопчет, нарушает архитектуру это, самим надо прикручивать, это чисто с настройками питона ковыряться, у меня есть мысли как это делать, потом займусь, может чёнить получится. Пока делаю через внешние вызовы, как говорил уже, через os.system, а там уже запускаю многопрессинг.

С тредингом не ты первый обломался)) обманчивое название.
Ну я честно говоря не особо понимаю как просчитать что то через вызов os.system
Понятно, это запускает внешнее приложение, если вызовем хрень.py то эта хрень запустится не на майском питоне, а на "системном" Но как в нее (хрень) передать необходимые данные из майки для просчета и получить результат обратно?? Пока скила не хватает.
 
Последнее редактирование:

4i4ikov

Знаток
Рейтинг
37
#39
Ну я честно говоря не особо понимаю как просчитать что то через вызов os.system
Да там просто всё. У тебя отдельный внешний питон должен стоять, на него и модули ставишь какие хочешь. Данные передавать либо через аргументы, либо через файлы. Обратно получать тоже либо через файлы, либо напрямую как результат от os.system.
Работает как обычные вызовы в винде через коммандную строку.

Например так, из майи
...
_LOADER_ = r'd:\chtototam\loader.py'
SRC = 'dst.txt'
DST = 'src.txt'
open(SRC,'w').write(data)
os.system(_LOADER_ +' %s > %s'%(SRC,DST)
result=open(DST ,'r').read()

Или так из майи
result = os.system(_LOADER_ +' %s'%data) # но так с мусором

loader.py работает уже на внешнем питоне без ограничений. В нём стандартная работа с аргументами
data = file(sys.argv[1], 'r').read()
...
print result
 

4i4ikov

Знаток
Рейтинг
37
#40
Ты-то нам и нужен был! прогони тест на своём FX
http://render.ru/xen/threads/nuzhna-pomosh-znatokov-po-vektornym-operacijam.163928/#post-1189413

потом замени функции на новые:
Код:
def vectorTest_4i4ikov(v1,v2,v3):
    v21 = v2-v1
    v13 = v1-v3
    v23 = v2-v3
    k = ((v13*v13)-(v23*v23))/(2*v21*v21) + 0.5
    return v2*k+v1*(1-k)
  
def vectorTest_Dark(v1,v2,v3):
    v21 = v2-v1
    return v1+(v3-v1)*v21*v21/(v21*v21)
 
Последнее редактирование:
Сверху