Комментарии 21
Есть нетбук на AMD C60 (Fusion) — в кристалле встроенный Radeon. Если интересно — погоняю и отпишусь. На майнинге выдает 8 мегахэш.
Как то просто выглядит функция float MathCalculations(float a, float b).
Вы уверены, что компилятор ее сам не привел к виду res = a*a*A + b*B + C? Компиляторы нынче умные… да и случай простой. Может asm покажите?
Вы уверены, что компилятор ее сам не привел к виду 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. Попробуйте, пожалуйста :)
Host реализация — это просто всё счетать в одном потоке. Можно написать тест на pthreads с очередями или какой-то другой библиотекой для работы с потоками и посмотреть как это соотносится с реализацией OpenCL на CPU.
Не понятно почему MSVC10 не смог использовать SSE оптимизации. Интересно было бы попробовать современный GCC, ну должен же он найти вектора и начать с ними работать нормально.
Не понятно почему MSVC10 не смог использовать SSE оптимизации. Интересно было бы попробовать современный GCC, ну должен же он найти вектора и начать с ними работать нормально.
Где-то видел на просторах Интернета, что MSVC в принципе забил на SSE. Что 6.0 что 2010.
Ага, поэтому даже в настройках компилятора можно выставить поддержку SSE?
Кстати, в настройках компилятора разрешено использовать SSE? (С/С++ -> Code Generation -> Enable Enhanced Instruction Set).
Кстати, в настройках компилятора разрешено использовать SSE? (С/С++ -> Code Generation -> Enable Enhanced Instruction Set).
Насколько я понимаю, поддержка != автоматическая векторизация. Хотя можно попробовать. Интеловский компилятор вроде может автоматом векторизовывать.
Хост = один поток, все по дефолту. Многопоточную версию посмотреть было бы интересно, но больше 4х она при всем желании не сделает:)
Так вроде GCC и MSVC10 требуют флагов для SSE
А как различается точность вычислений с плавающей запятой на CPU и использованием OpenCL и без?
Мне для повышения точности моделирования приходится собирать приложение в Debug (чтобы получить 80-разрядные вычисления на double).
Мне для повышения точности моделирования приходится собирать приложение в Debug (чтобы получить 80-разрядные вычисления на double).
#include "MathCode.cpp"
А можно также включать в opencl код файлы кода написанные на C#?
Зарегистрируйтесь на Хабре, чтобы оставить комментарий
Первые шаги с OpenCL или сказ о том как одинаковый код на GPU и CPU запускать