Как стать автором
Обновить

Комментарии 21

Есть нетбук на AMD C60 (Fusion) — в кристалле встроенный Radeon. Если интересно — погоняю и отпишусь. На майнинге выдает 8 мегахэш.
Как то просто выглядит функция float MathCalculations(float a, float b).

Вы уверены, что компилятор ее сам не привел к виду res = a*a*A + b*B + C? Компиляторы нынче умные… да и случай простой. Может asm покажите?
Я достаточно уверен, что не приводит. Изначально она такой упрощенной и была, тогда цифры сходились с разницей в производительности памяти, а тут сходятся с разницей в производительности арифметики. Возможно если сказать компилятору, чтобы он сильнее оптимизировал, то он заменит.
Все верно, компилятор(VS2010) не сообразит(на счет других не знаю). Пробовал включать sse2, оптимизацию по скорости, float point model(FAST). Код изменился незначительно(функция MathCalculations):
БЫЛО:
...
fld     dword ptr [ebp+8H] 
fmul    st(0), st(0)           
fld     dword ptr [ebp+0CH]    
fld     qword ptr [?_0812]     
fmul    st(0), st(1)           
fld     st(1)                  
fmul    qword ptr [?_0811]     
fst     qword ptr [ebp-20H]    
fld     st(2)                  
fmul    qword ptr [?_0810]     
fst     qword ptr [ebp-28H]
...


СТАЛО:
...
movaps  xmm6, xmm0               
mulss   xmm6, dword ptr [?_0801] 
movss   dword ptr [ebp-4H], xmm6 
movaps  xmm2, xmm0               
mulss   xmm2, dword ptr [?_0800] 
movaps  xmm3, xmm0               
mulss   xmm3, dword ptr [?_0799] 
movaps  xmm4, xmm0               
mulss   xmm4, dword ptr [?_0798] 
movaps  xmm5, xmm0               
mulss   xmm5, dword ptr [?_0797] 
...


Полагаю, что оптимизация не получилось из-за того, что компилятор боится переставить операции местами, так как это повлияет на результат.
Почему повлияет на результат?
Из за формата представления чисел с точкой. Пример на python:
Python 2.7.3 (default, Apr 10 2012, 23:24:47) [MSC v.1500 64 bit (AMD64)] on win32
Type "help", "copyright", "credits" or "license" for more information.
>>> a = 0.1 * 1 + 0.1 * 2 + 0.1 * 3 + 0.1 * 4 + 0.1 * 5 + 0.1 * 6 + 0.1 * 7 + 0.1 * 8 + 0.1 * 9
>>> b = 0.1 * (1 + 2 + 3 + 4 + 5 + 6 + 7 + 8 + 9)
>>> print (a, " ", b)
(4.500000000000001, ' ', 4.5)
>>> print (a == b)
False
>>>
Ну так не O3 единым, ещё надо поставить опцию /fp:fast. Попробуйте, пожалуйста :)
Уже. float point model(FAST) = /fp:fast
Host реализация — это просто всё счетать в одном потоке. Можно написать тест на pthreads с очередями или какой-то другой библиотекой для работы с потоками и посмотреть как это соотносится с реализацией OpenCL на CPU.

Не понятно почему MSVC10 не смог использовать SSE оптимизации. Интересно было бы попробовать современный GCC, ну должен же он найти вектора и начать с ними работать нормально.
Где-то видел на просторах Интернета, что MSVC в принципе забил на SSE. Что 6.0 что 2010.
Ага, поэтому даже в настройках компилятора можно выставить поддержку SSE?
Кстати, в настройках компилятора разрешено использовать SSE? (С/С++ -> Code Generation -> Enable Enhanced Instruction Set).
Насколько я понимаю, поддержка != автоматическая векторизация. Хотя можно попробовать. Интеловский компилятор вроде может автоматом векторизовывать.
попробовал, ничего не изменилось.
В ICC есть флаг –vec-report для получения отчета о выполненной векторизации. И, если не выполнилась, то выводится причина. Может и в MSVC есть что-то подобное?
Хост = один поток, все по дефолту. Многопоточную версию посмотреть было бы интересно, но больше 4х она при всем желании не сделает:)
Так вроде GCC и MSVC10 требуют флагов для SSE
Akson87
есть дома ivy bridge, но на мониторе сгорел hdmi. как смогу, так проведу тест.
Спасибо, было бы интересно взглянуть
А как различается точность вычислений с плавающей запятой на CPU и использованием OpenCL и без?
Мне для повышения точности моделирования приходится собирать приложение в Debug (чтобы получить 80-разрядные вычисления на double).
Больше 32/64 не будет в OpenCL, насколько я понимаю. На процессоре оно использует сейчас SSE/AVX, а там 80битной арифметики нет. На видеокартах тоже нет.
#include "MathCode.cpp"


А можно также включать в opencl код файлы кода написанные на C#?
Зарегистрируйтесь на Хабре, чтобы оставить комментарий

Публикации

Изменить настройки темы

Истории