OpenCL: внутренние тесты реализации в MQL5 - страница 52

Andrey Miguzov
1919
Andrey Miguzov  
joo:
Я так понял, если хотим передать в GPU двумерный/многомерный массив с данными, то можем воспользоваться представлением данных в виде структуры и структуру передавать?

Попробовал через структуру - получилось! Сам бы в жизни не догадался таким образом многомерные массивы передавать :) Спасибо!

Прикрепил маленький примерчик с использованием двумерных массивов - считает за милую душу. Пример кривой малость - но в целом возможность такого извращения демонстрирует неплохо :) 

PS: Ваш UGA + OpenCL - это просто никаких эмоций не хватает. :)   Как раньше жили - жутко вспомнить...

Документация по MQL5: Основы языка / Переменные
Документация по MQL5: Основы языка / Переменные
  • www.mql5.com
Основы языка / Переменные - Документация по MQL5
Файлы:
Andrey Dik
13255
Andrey Dik  
MigVRN:

PS: Ваш UGA + OpenCL - это просто никаких эмоций не хватает. :)   Как раньше жили - жутко вспомнить...

Спасибо, я рад, что Вам нравится. А за одно, воспользовавшись случаем, передаю привет и Большое Спасибо  Ильясу Шарапову (mql5).
Andrey Dik
13255
Andrey Dik  

CL_DEVICE_ANY и  CL_DEVICE_GPU уже устарели?

Сейчас актуальны CL_USE_ANY и CL_USE_GPU_ONLY?


Vladimir Gomonov
8295
Vladimir Gomonov  
joo:

CL_DEVICE_ANY и  CL_DEVICE_GPU уже устарели?

Сейчас актуальны CL_USE_ANY и CL_USE_GPU_ONLY?

Да.
Andrey Dik
13255
Andrey Dik  
MetaDriver:
Да.

Обнаружил по методу профессора Тычкова у себя в компьютере загадочное устройство 1, которое работает быстрее чем CL_USE_ANY  и даже быстрее чем CL_USE_GPU_ONLY.

Что это? :O

Vladimir Gomonov
8295
Vladimir Gomonov  
joo:

Обнаружил по методу профессора Тычкова у себя в компьютере загадочное устройство 1, которое работает быстрее чем CL_USE_ANY  и даже быстрее чем CL_USE_GPU_ONLY.

Что это? :O

Стейты в студию. По всем устройствам. :)
Andrey Dik
13255
Andrey Dik  
MetaDriver:
Стейты в студию. По всем устройствам. :)
CL_USE_ANY

2012.04.12 23:27:29    Struct_OpenCL (GBPUSD,H1)    Разница в расчетах между GPY и CPY: 0.0
2012.04.12 23:27:28    Struct_OpenCL (GBPUSD,H1)    CPY/GPU= 1.326
2012.04.12 23:27:28    Struct_OpenCL (GBPUSD,H1)    Время GPU = 141 ms

2012.04.12 23:27:28    Struct_OpenCL (GBPUSD,H1)    Время СPU = 187 ms


CL_USE_GPU_ONLY

2012.04.12 23:29:11    Struct_OpenCL (GBPUSD,H1)    Разница в расчетах между GPY и CPY: 0.0
2012.04.12 23:29:11    Struct_OpenCL (GBPUSD,H1)    CPY/GPU= 1.376
2012.04.12 23:29:11    Struct_OpenCL (GBPUSD,H1)    Время GPU = 125 ms

2012.04.12 23:29:11    Struct_OpenCL (GBPUSD,H1)    Время СPU = 172 ms


1

2012.04.12 23:30:12    Struct_OpenCL (GBPUSD,H1)    Разница в расчетах между GPY и CPY: 0.0
2012.04.12 23:30:12    Struct_OpenCL (GBPUSD,H1)    CPY/GPU= 2.397
2012.04.12 23:30:12    Struct_OpenCL (GBPUSD,H1)    Время GPU = 78 ms

2012.04.12 23:30:12    Struct_OpenCL (GBPUSD,H1)    Время СPU = 187 ms


Всем рекомендую пошивырятся таким образом как я, вполне возможно, что найдете у себя более быстрое устройство, чем беспонтовая дискретная графика. :D


PS. Подозреваю, что CL_USE_ANY и CL_USE_GPU_ONLY одно и тоже - расчет на CPU, а вот устройство 1 и есть мой GPU. Это элементарная путаница в стандартных константах.

Andrey Miguzov
1919
Andrey Miguzov  
joo:

Всем рекомендую пошивырятся таким образом как я, вполне возможно, что найдете у себя более быстрое устройство, чем беспонтовая дискретная графика. :D

PS. Подозреваю, что CL_USE_ANY и CL_USE_GPU_ONLY одно и тоже - расчет на CPU, а вот устройство 1 и есть мой GPU. Это элементарная путаница в стандартных константах.

Вот что вычитал! В справке терминала не было! Подправил код с учетом этих изменений. Посмотрите что у Вас получится. У меня вот так:

23:17:00 Время СPU = 1155 ms
23:17:01 Всего устройств c возможностями OpenCL: 2
23:17:02 Время GPU №0 = 249 ms
23:17:02 CPY/GPU №0= 4.639
23:17:03 Время GPU №1 = 265 ms
23:17:03 CPY/GPU №1= 4.358

GPU: Advanced Micro Devices, Inc. Turks with OpenCL 1.1 (6 units, 725 MHz, 1024 Mb, version CAL 1.4.1703 (VM))
CPU: GenuineIntel Intel(R) Core(TM) i3-2310M CPU @ 2.10GHz with OpenCL 1.1 (4 units, 2095 MHz, 5990 Mb, version 2.0)
Файлы:
Dmitriy Parfenovich
4582
Dmitriy Parfenovich  
2012.04.12 22:37:07     OpenCL  GPU: NVIDIA Corporation GeForce GT 440 with OpenCL 1.1 (2 units, 1660 MHz, 1024 Mb, version 296.10)
2012.04.12 22:37:07     OpenCL  CPU: AuthenticAMD AMD Athlon(tm) II X4 630 Processor with OpenCL 1.1 (4 units, 2998 MHz, 2048 Mb, version 2.0)
2012.04.12 22:39:46     Struct_OpenCL__1 (EURUSD,H1)    Время СPU = 686 ms
2012.04.12 22:39:47     Struct_OpenCL__1 (EURUSD,H1)    Всего устройств c возможностями OpenCL: 2
2012.04.12 22:39:50     Struct_OpenCL__1 (EURUSD,H1)    Время GPU №0 = 172 ms
2012.04.12 22:39:50     Struct_OpenCL__1 (EURUSD,H1)    CPY/GPU №0= 3.988
2012.04.12 22:39:51     Struct_OpenCL__1 (EURUSD,H1)    Время GPU №1 = 406 ms
2012.04.12 22:39:51     Struct_OpenCL__1 (EURUSD,H1)    CPY/GPU №1= 1.690
Andrey Dik
13255
Andrey Dik  
MigVRN:

Попробуйте использовать такую структуру, у меня не получилось (подозреваю, что второе измерение должно быть фиксированного размера, поэтому у меня и не получилось):

struct Array2dFloat
{
  float Column[];
  int LineCount(int lineCount)
  {
    int size = ArrayResize(Column,lineCount);
    ArrayInitialize(Column,0.0);
    return(size);
  }
};

И, для удобства, такую функцию для ресайза обоих измерений:

void ArrayResize2DArrayFloat(Array2dFloat &ArrayOfArray[], int columnCount,int lineCount)
{
  // разбивка по вертикали
  ArrayResize(ArrayOfArray,columnCount);
  // разбивка по горизонтали
  for(int i=0;i<columnCount;i++)
    ArrayOfArray[i].LineCount(lineCount);
}