Последние темы Поиск
Общие форумы
Специализированные форумы
ПроцессорыРазгон и охлаждениеСистемные платыМодули памятиВидеосистемаTV- и FM-тюнеры, видеовход, видеовыходЦифровое видео: захват, монтаж, обработкаМониторы и другие устройства отображенияЦифровое фотоБеспилотные летательные аппаратыЦифровой звукProAudio: Профессиональное звуковое оборудованиеСтереосистемыДомашний кинотеатр: проигрыватели и источники сигналаДомашний кинотеатр: аудиосистемаДомашний кинотеатр: ТV и проекторыМагнитные и SSD накопителиОптические носители информацииСетевые носители информацииПериферияКорпуса, блоки питания, UPSСети, сетевые технологии, подключение к интернетуСистемное администрирование, безопасностьСерверыНоутбуки, нетбуки и ультрабукиПланшеты и электронные книгиМобильные телефоны, смартфоны, кпк, коммуникаторыМобильные гаджетыОператоры и технологии мобильной связиТелефония, телекоммуникации, офисные АТСБытовая техника
Программы
Игры
Авторские форумы
Прочие форумы
Форумы поддержки портала iXBT.com
Архивы конференции
Архив "О Конференции"Архив "Процессоры"Архив "Разгон и охлаждение"Архив "Системные платы"Архив "Модули памяти"Архив "Видеосистема"Архив "Видеозахват"Архив "Мониторы и другие устройства отображения"Архив "Цифровое изображение"Архив "Цифровой звук"Архив "Периферия"Архив "Корпуса, блоки питания, UPS"Архив "Коммуникации: сети и сетевые технологии"Домашний интернет, модемы (архив)Архив "Системное администрирование, безопасность"Архив "Мобильная связь"Программы Microsoft: Windows, Office, Server, Windows LiveАрхив "OС и системное ПО"Архив "Программы: Интернет"Архив "Программирование"Форум прикладных программистовАрхив "Электронные устройства и компоненты"Архив "Околокомпьютерный Флейм & Общий"Архив "Полемика (Злобный Флейм)"Околоавтомобильный ФлеймФорум ремонтниковВопросы компании IntelФотокамеры SamsungФорум о магазине приложений RuStoreФорум по продукции компании Huawei
Справка и сервисы
Другие проекты iXBT.com
Страницы:Кликните, чтобы указать произвольную страницу12далее
sergen: OMP Reduction в С?
sergen
Member
Автор темы
122/142 ответов
18 лет на iXBT, с декабря 2006
1 фото на iXBT.photo
Чаще пишет в "Процессоры" (53%)
Инфо Ответить
s
sergen Member Автор темы
17 лет назад / 19 марта 2008 08:39
Простенькая задача:
Дан большой (миллиарды) массив комплексных чисел.
Надо: мин и мах по реальной и комплексной компоненте и по амплитуде.
Я на фортране решил "в лоб" с неплохой масштабируемостью (~7х на 8-ми ядрах).
Для 440 миллионов чисел: 16 секунд на одном ядре против 2.2 секунд на восьми.
Все решение заняло 15 минут на кодирование и три десятка строк.

Потом захотелось "красивостей".
Решили написать то же на С++.
Тут же обнаружили, что мин/мах редукции в С нет (ни у МS, ни у Интела).
"Изобрели" за час, но получился монстр.
Скорость примерно та же, как и в Фортране (на интеловском С).
Но выглядит преотвратно.
(К тому же, требует ОМП длл, а у Фортрана есть статическая библиотека)

Праздный вопрос (праздный, потому как слинковали с фортраном): как в С делать "красивую" редукцию?

FORTRAN
SUBROUTINE CALCSTATS(A, N, &
max_real, min_real, &
max_imag, min_imag, &
max_abs, min_abs)
IMPLICIT NONE
integer(8), intent(in):: N
complex(4), intent(in):: A(N)
real(4), intent(inout):: max_real, min_real, &
max_imag, min_imag, &
min_abs, max_abs
real(4) my_abs
integer(8) i

!$OMP PARALLEL DO REDUCTION(MAX: max_real,max_imag,max_abs) REDUCTION(MIN: min_real,min_imag,min_abs) PRIVATE(my_abs)
do i = 1, N
max_real = MAX(REAL(A(i)), max_real)
min_real = MIN(REAL(A(i)), min_real)

max_imag = MAX(IMAG(A(i)), max_imag)
min_imag = MIN(IMAG(A(i)), min_imag)

my_abs = REAL(A(i)) * REAL(A(i)) + IMAG(A(i)) * IMAG(A(i))

max_abs = MAX(my_abs, max_abs)
min_abs = MIN(my_abs, min_abs)
end do
!$OMP END PARALLEL DO
max_abs = SQRT(max_abs)
min_abs = SQRT(min_abs)
end SUBROUTINE CALCSTATS
C++
static void CalcStats(const std::complex<float> * A, 
long long N,
float& max_real_val, float& min_real_val,
float& max_imag_val, float& min_imag_val,
float& min_abs_val, float& max_abs_val)
{
const int cores = omp_get_max_threads();

// Allocate
// It might crash with large # of cores :)
float * my_min_real_val = (float *)alloca(cores * sizeof(float));
float * my_max_real_val = (float *)alloca(cores * sizeof(float));
float * my_min_imag_val = (float *)alloca(cores * sizeof(float));
float * my_max_imag_val = (float *)alloca(cores * sizeof(float));
float * my_min_abs_val = (float *)alloca(cores * sizeof(float));
float * my_max_abs_val = (float *)alloca(cores * sizeof(float));

// Init
for (int core = 0; core < cores; core++)
{
my_min_real_val[core] = min_real_val;
my_max_real_val[core] = max_real_val;

my_min_imag_val[core] = min_imag_val;
my_max_imag_val[core] = max_imag_val;

my_min_abs_val[core] = min_abs_val;
my_max_abs_val[core] = max_abs_val;
}

#pragma omp parallel shared(cores, A)
{
// Init each core's TLS, to prevent cache line corruption
float my_min_real = min_real_val;
float my_max_real = max_real_val;

float my_min_imag = min_imag_val;
float my_max_imag = max_imag_val;

float my_min_abs = min_abs_val;
float my_max_abs = max_abs_val;

const int core = omp_get_thread_num();
long long start = (N / cores) * core;
long long end = (N / cores) * (core+1);

// Calculate on each core
for (long long i = start; i < end; i++)
{
float my_real = A[i].real();
float my_imag = A[i].imag();
float my_abs = (my_real * my_real + my_imag * my_imag);

my_min_real= min(my_real, my_min_real);
my_max_real= max(my_real, my_max_real);

my_min_imag= min(my_imag, my_min_imag);
my_max_imag= max(my_imag, my_max_imag);

my_min_abs = min(my_abs, my_min_abs);
my_max_abs = max(my_abs, my_max_abs);
}

// Reduction to common array
my_min_real_val[core] = my_min_real;
my_max_real_val[core] = my_max_real;

my_min_imag_val[core] = my_min_imag;
my_max_imag_val[core] = my_max_imag;

my_min_abs_val[core] = my_min_abs;
my_max_abs_val[core] = my_max_abs;
}

// Reduction to finals
for (int core = 0; core < cores; core++)
{
min_real_val = min(min_real_val, my_min_real_val[core]);
max_real_val = max(max_real_val, my_max_real_val[core]);

min_imag_val = min(min_imag_val, my_min_imag_val[core]);
max_imag_val = max(max_imag_val, my_max_imag_val[core]);

min_abs_val = min(min_abs_val, my_min_abs_val[core]);
max_abs_val = max(max_abs_val, my_max_abs_val[core]);
}

max_abs_val = sqrt(max_abs_val);
min_abs_val = sqrt(min_abs_val);
}
bess
unregistered
Ответить
b
bess unregistered
17 лет назад / 19 марта 2008 16:38
sergen

> Тут же обнаружили, что мин/мах редукции в С нет (ни у МS, ни у Интела).

Неужели нет ??? Признаюсь, что не работаю на C (в научных вычислениях), но звучит странно, ибо всё должно совпадать с Фортраном. Вы не могли бы привести ссылку на документ, подстверждающий ваши слова ???

P.S. А зачем "переходить" на C ?
alvlal
Member
846/3788 ответов
21 год на iXBT, с октября 2003
150 фото на iXBT.photo
Чаще пишет в "Фото" (82%)
Россия, San Francisco Bay Area
Инфо Ответить
a
alvlal Member
17 лет назад / 19 марта 2008 23:03
bess
Нет, как это ни странно, я тоже сталкивался. Приходится "безопасно" выкручиваться с критическими секциями.

Добавление от 19.03.2008 23:04:

Правда это пару лет назад было, может сейчас уже сделали.

Добавление от 19.03.2008 23:26:

sergen
Возможно это лучший вариант. Я делал без таких манипуляций, через критические секции, и была существенная потеря производительности (правда с фортрановской встроенной редукцией не сранивал), а тут если работает как на фортране, то наверное хорошо.
bess
unregistered
Ответить
b
bess unregistered
17 лет назад / 19 марта 2008 23:28
alvlal

> Нет, как это ни странно, я тоже сталкивался

Всё-таки хотелось бы увидеть это в документе. Ладно, сам разыщу
Хмм
Member
1787/4808 ответов
22 года на iXBT, с ноября 2002
Чаще пишет в "Общий" (25%)
США, Los Angeles, California
Инфо Ответить
Хмм Member
17 лет назад / 19 марта 2008 23:53
sergen: ... обнаружили, что мин/мах редукции в С нет (ни у МS, ни у Интела) ...
Вы пытались написать типа "#pragma omp parallel for reduction(max: ...)"?

Мне понравилась идея. Особенно, если учесть, что "max" в языке С - это либо имя макроса, либо имя подпрограммы.

Добавление от 20.03.2008 00:15:

bess:всё должно совпадать с Фортраном
Если бы язык С совпадал с языком FORTRAN, то так бы и назывался FORTRAN-ом.
bess
unregistered
Ответить
b
bess unregistered
17 лет назад / 20 марта 2008 01:04
Хмм

> Если бы язык С совпадал с языком FORTRAN, то так бы и назывался FORTRAN-ом

Если OpenMP делают одинаковым для двух языков, значит, его делают одинаковым. Тем более что нет решительно никаких причин делать разным (в данном случае - и я имею в виду не слово "max", конечно). Так что лучше бы вы привели правильное решение либо ссылку на документ - чтобы не ждать до завтра, когда приду на работу и посмотрю там
sergen
Member
Автор темы
123/143 ответов
18 лет на iXBT, с декабря 2006
1 фото на iXBT.photo
Чаще пишет в "Процессоры" (53%)
Инфо Ответить
s
sergen Member Автор темы
17 лет назад / 20 марта 2008 02:15
Хмм:
Вы пытались написать типа "#pragma omp parallel for reduction(max: ...)"?
Нет, я сначала документацию прочитал
bess:
Вы не могли бы привести ссылку на документ, подстверждающий ваши слова ???
См. прикрепленный скриншот с optaps_cls.chm (Intel C++ 10.1.020)
А зачем "переходить" на C ?
Периодическо приходит поколение младое, с горящими глазами и начинает утверждать, что в 21-м веке все должно быть на C#/PHP/Python или в крайнем случае на C++ (стэнфордские студенты предпочитают GCC ).

Мы пугаемся, что остали от жизни или что-то пропустили в текущих технологиях. После подобных проверок, убеждаемся что "воз и ныне там" и посылаем молодежь на картошку писать веб-формы подальше.

А стэнфордских студентов просим скомпилировать на ГЦЦ следующий код и объяснить почему 10 == -10 :

#include <stdio.h>
#include <stdlib.h>
int main(void)
{
int a = 2;
if ((-10)*abs(a-1)==(10)*abs(a-1))
{
printf("OMG! -10 == 10!!!\n");
}
else
{
printf("Nothing special\n");
}
return 0;
}
К сообщению приложены файлы:
bess
unregistered
Ответить
b
bess unregistered
17 лет назад / 20 марта 2008 02:37
sergen

> скомпилировать на ГЦЦ следующий код и объяснить почему 10 == -10

А почему, кстати ? И в каких версиях ? (никогда не воевал с Сишниками и потому не слышал этого прикола)
sergen
Member
Автор темы
124/144 ответов
18 лет на iXBT, с декабря 2006
1 фото на iXBT.photo
Чаще пишет в "Процессоры" (53%)
Инфо Ответить
s
sergen Member Автор темы
17 лет назад / 20 марта 2008 02:55
bess:
А почему, кстати ? И в каких версиях ? (никогда не воевал с Сишниками и потому не слышал этого прикола)
Я с Сишниками не воюю (у нас только счет на F, все остальное -- на C).
Да и с brain-dead freetards, которые мне втюхивают счасливое GPL будущее, я тоже не воюю.
Тем более, что сам по молодости таким был (я еще линух 0.9x с дискет в 92-м году ставил )
Я их посылаю

А эта ошибочка у них давно.
И в Гцц 3х, и в 4х (у меня 2 рабочие станции, виста и линух):
gcc version 3.4.4 (cygming special, gdc 0.12, using dmd 0.125)
gcc version 4.2.1 (SUSE Linux)

Исправлено: sergen, 20.03.2008 03:25

bess
unregistered
Ответить
b
bess unregistered
17 лет назад / 20 марта 2008 03:05
sergen

Всё-таки, ПОЧЕМУ у них эта ошибка ? Что там генерится ? В том смысле, что эквивалент КАКОЙ конструкции на C там генерится ??

А за информацию про отсутствии min/max в редукции спасибо - действительно, нет в стандарте (даже 2.5). Удивительно - неужели нельзя было найти какой-либо выход из положения ???
sergen
Member
Автор темы
125/145 ответов
18 лет на iXBT, с декабря 2006
1 фото на iXBT.photo
Чаще пишет в "Процессоры" (53%)
Инфо Ответить
s
sergen Member Автор темы
17 лет назад / 20 марта 2008 03:24
sergen:
bess:Всё-таки, ПОЧЕМУ у них эта ошибка ? Что там генерится ? В том смысле, что эквивалент КАКОЙ конструкции на C там генерится ??
Судя по всему, на верхнем уровне где-то.
Понятия не имею! Да и интересно мне это только чтоб фонтаны красноречия затыкать.

Добавление от 20.03.2008 03:58:

alvlal:
... если работает как на фортране, то наверное хорошо.
Раз в 100 хорошее, чем с секциями
Критические секции -- это всегда плохо.
От них надо уходить всегда.
И всегда это можно сделать (по крайней мере, я еще не видел контр-примеров).

Добавление от 20.03.2008 04:12:

bess:
действительно, нет в стандарте (даже 2.5).
Да, сам заглянул в стандарт Version 2.5 May 2005 (секция 2.8.3.6).
Для Фортрана есть, а для С нет .
А я на компиляторы грешил.

Добавление от 20.03.2008 05:03:

bess:
sergen

Всё-таки, ПОЧЕМУ у них эта ошибка ? Что там генерится ? В том смысле, что эквивалент КАКОЙ конструкции на C там генерится ??
Вот, нашёл первоисточник:
http://rqk.livejournal.com/322119.html
Там и объяснения есть.

Исправлено: sergen, 20.03.2008 10:48

Хмм
Member
1788/4809 ответов
22 года на iXBT, с ноября 2002
Чаще пишет в "Общий" (25%)
США, Los Angeles, California
Инфо Ответить
Хмм Member
17 лет назад / 20 марта 2008 09:49
bess:лучше бы вы привели правильное решение либо ссылку на документ
С min/max оно настолько очевидно, что выпал в осадок от мысли, что кому-то нужен документ. FORTRAN и C проектировались для разных целей. У них семантика и синтаксис разные. Не может не сказываться на коде, а так же не влиять на OMP. Очевидно FORTRAN будет элегантней в научных вычислениях, а C в сложных манипуляциях с данными и выжимании последнего процента быстродействия через геморрой. Однако, это не заслуживает внимания. Это всё равно как выбирать на чём писать письмо для любимой - на греческом или на санскрите - в то время, когда следует думать о смысле послания.

Мне кажется, товарищ мыслит в принципиально неправильном направлении, так что всё это вопрос чисто академический. Обычно min/max быстрее посчитать не отдельной стадией, а вместе в с вычислением или загрузкой массива комплексных чисел. Обычно создать такой массив намного дольше, чем считать чистый min/max. Тем более, что при очень большом размере массива отдельная стадия вычисления min/max сбросит кеш процессора или вообще отсвопает часть массива на диск.
sergen
Member
Автор темы
126/146 ответов
18 лет на iXBT, с декабря 2006
1 фото на iXBT.photo
Чаще пишет в "Процессоры" (53%)
Инфо Ответить
s
sergen Member Автор темы
17 лет назад / 20 марта 2008 10:46
Хмм:...товарищ мыслит в принципиально неправильном направлении...
Обычно создать такой массив намного дольше, чем считать чистый min/max. Тем более, что при очень большом размере массива отдельная стадия вычисления min/max сбросит кеш процессора или вообще отсвопает часть массива на диск.
Как у нас любят осуждать .
Мне кажется, Вы немного отстали от современного уровня Рабочих Станций.
Моя -- устаревшая, всего 24 ГБ РАМ. Осенью надо будет до 64 довести (и добавить ядер). Заметьте, это отнюдь не high-end!

Это было о "своппинге".

Данные -- замер с прибора, вброшены в память железкой, а не считанные (о контроллерах ПДП слыхали?). Подпрограмма -- часть визуализации этих данных. Для превращения чисел в РЖБ, надо их сначала нормализовать (хотя есть и другие подходы, да).

Впрочем, программа уже работает, и работает без "отсвопа" и "сброса кэша" (И как я могу "сбросить кэш" при последовательном доступе к памяти? ).

В оригинальном посте я не просил помощи в оптимизации.
Вопрос был о существовании алгоритма С-редукции, отличного от приведённого.


Согласен, при наличии Фортрана, вопрос чисто академический.
И задан был "академикам" в С/C++, если таковые присутствуют на форуме.
bess
unregistered
Ответить
b
bess unregistered
17 лет назад / 20 марта 2008 11:14
Хмм

> С min/max оно настолько очевидно, что выпал в осадок от мысли, что кому-то нужен документ. FORTRAN и C проектировались для разных целей.

Погодите - причём тут разные цели языков, если речь идёт об одинаковой цели OpenMP ? Впрочем, если вы считаете, что C не должен быть предназначен для научных расчётов, то тут я спорить не буду

> У них семантика и синтаксис разные

Да, синтаксис и подвёл Всё-таки безобразие - жизненно важная конструкция не может быть реализована натуральным образом ! Только лишь потому, что для неё не придумали в своё время знака операции и приходится вызывать как функция. Я ведь правильно понимаю проблему ?

> Это всё равно как выбирать на чём писать письмо для любимой - на греческом или на санскрите - в то время, когда следует думать о смысле послания

Отнюдь. На ассемблере тоже можно что угодно запрограммировать. А C - всё-таки язык более высокого уровня, чем Fortran. Понятное дело, что какие-то вещи (в более сложном языке) по концептуальным причинам могут быть сделаны не столь удобно. Но здесь речь идёт не о неудобстве - а о невозможности сделать это натуральным образом. Таким образом, каким подразумевает идея OpenMP. Собственно, эта идея заключается в том, что естественно-распараллеливаемые конструкции записываются в OpenMP-Фортране (либо Си) обычным "последовательным" образом, то есть программа специально не меняется для параллельности - если не считать директив ("комментариев") !$OMP. А в приведённом примере на Си этого уже не сделаешь

Кстати, эта идея OpenMP прекрасно оправдывает на практике. Сужу по проекту, в котором участвую - основной код там гонит пара низкоквалифицированных программеров (француз-полуараб и ливанец-маронит) - по сути, каких-никаких физиков, научившихся колотить по клавишам. И иного способа произвести распараллеленный продукт, кроме как через OpenMP, нет - зато с ним выходит превосходно. Разумеется, для этого понадобился надзиратель из России на коне и с плёткой в руке

> Обычно min/max быстрее посчитать не отдельной стадией, а вместе в с вычислением или загрузкой массива комплексных чисел. Обычно создать такой массив намного дольше, чем считать чистый min/max

Даже если так и делается "обычно", проблема всё равно остаётся. И даже обостряется. Так как усложнять приходится не простой короткий циклик вычисления максимума, а большой сложный цикл содержательных вычислений. Отделять вычисление максимума от которого нельзя как раз по причинам, связанным с кэшем. И в коде, о котором я сказал выше, редукция MAX как раз очень важна (для вычисления невязок и проч.) ...

sergen

Понятно, что от вашего частного вопроса пошли волны в разные стороны. Но это вполне нормально, так как вопрос оказался интересным и актуальным. Так что спасибо, дали возможность повеселиться (и можем продолжить, если не исчерпалось ещё)
sergen
Member
Автор темы
127/147 ответов
18 лет на iXBT, с декабря 2006
1 фото на iXBT.photo
Чаще пишет в "Процессоры" (53%)
Инфо Ответить
s
sergen Member Автор темы
17 лет назад / 20 марта 2008 11:39
bess:
(и можем продолжить, если не исчерпалось ещё)
Посмотрите внимательно на С код, и представьте что с ним будет на большем кол-ве ядер. И я даже не имею в виду крэш alloca на стеке! Там и свёртку по ядрам параллелить придётся .
bess
unregistered
Ответить
b
bess unregistered
17 лет назад / 20 марта 2008 12:09
sergen

Не надо меня в этом убеждать - я и сам ужасаюсь Тем не менее, идеи собирать и обдумывать надо. Ибо и в Фортране на уровне OpenMP реализованы лишь самые простые вещи - то есть распараллеливание циклов без рекурсивных (рекуррентных) зависимостей, да самые простые зависимости (редукция). Даже решение трёхдиагональной системы не распараллелить
sergen
Member
Автор темы
128/148 ответов
18 лет на iXBT, с декабря 2006
1 фото на iXBT.photo
Чаще пишет в "Процессоры" (53%)
Инфо Ответить
s
sergen Member Автор темы
17 лет назад / 20 марта 2008 12:25
bess:
Даже решение трёхдиагональной системы не распараллелить
Я вот уже задумывался о конвейеризации ядер, вместо распаралелливания.
Особенно тех, которые на общем кэше.

Кстати, как программно определить "сопряженные", с общим кэшем ядра, не знаете случайно?
plyrvt
Member
2239/3035 ответов
20 лет на iXBT, с ноября 2004
7 фото на iXBT.photo
Чаще пишет в "Процессоры" (75%)
Украина
Инфо Ответить
p
plyrvt Member
17 лет назад / 20 марта 2008 15:15
А эта ошибочка у них давно.
И в Гцц 3х, и в 4х (у меня 2 рабочие станции, виста и линух):
gcc version 3.4.4 (cygming special, gdc 0.12, using dmd 0.125)
gcc version 4.2.1 (SUSE Linux)
# gcc -v && gcc test.c && echo && ./a.out
Using built-in specs.
Target: i386-undermydesk-freebsd
Configured with: FreeBSD/i386 system compiler
Thread model: posix
gcc version 4.2.1 20070719  [FreeBSD]
 
Nothing special
bess
unregistered
Ответить
b
bess unregistered
17 лет назад / 20 марта 2008 18:30
sergen

> Кстати, как программно определить "сопряженные", с общим кэшем ядра, не знаете случайно?

По номерам. При условии, что используете утилиту, производязую надёжную привязку (аффилирование) процессов к ядрам. У Альткса это "dplace", а на x86 я использую "taskset" (возможно, существует ещё что-то).
SergeAS
Member
447/702 ответов
20 лет на iXBT, с октября 2004
Чаще пишет в "Процессоры" (75%)
Россия, Москва
Web-страница
Инфо Ответить
SergeAS Member
17 лет назад / 20 марта 2008 18:50
bess:
alvlal

> Нет, как это ни странно, я тоже сталкивался

Всё-таки хотелось бы увидеть это в документе. Ладно, сам разыщу
https://computing.llnl.gov/tutorials/openMP/#REDUCTION

см. табличку в конце параграфа
bess
unregistered
Ответить
b
bess unregistered
17 лет назад / 20 марта 2008 18:57
SergeAS

Да, спасибо, уже разобрались (причём не по официальному документу, а не туториалу).
SergeAS
Member
448/703 ответов
20 лет на iXBT, с октября 2004
Чаще пишет в "Процессоры" (75%)
Россия, Москва
Web-страница
Инфо Ответить
SergeAS Member
17 лет назад / 20 марта 2008 19:12
bess:
sergen

> Кстати, как программно определить "сопряженные", с общим кэшем ядра, не знаете случайно?

... а на x86 я использую "taskset" (возможно, существует ещё что-то).
Это видимо для Linux как целевой платформы ?

Если это делать действительно программно (на С) то для
Linux: sched_setaffinity()
Windows: SetProcessAffinityMask()
Хмм
Member
1789/4813 ответов
22 года на iXBT, с ноября 2002
Чаще пишет в "Общий" (25%)
США, Los Angeles, California
Инфо Ответить
Хмм Member
17 лет назад / 20 марта 2008 19:53
bess:Только лишь потому, что для неё не придумали в своё время знака операции и приходится вызывать как функция. Я ведь правильно понимаю проблему ?
1. В языке С вызов функции "()" трактуется как обычная операция типа "+" или "=". Авторы OpenMP почему-то не задумались о возможности редукции таких операций. Опять же в С было принято записывать "max" в форме "(a >= b) ? a : b", но задумались ли создатели OpenMP об этом? Хотите или не хотите, но синтаксис, семантику и традиции языка необходимо было учитывать.

2. Если включать в язык все возможные полезные атомарные операции, то получится бесконечный список. Где-то надо остановиться. Вот в С++ Вы можете создать свой объект и переопределить для него операцию "a+b" в "(a >= b) ? a : b" или даже намного круче. Например, атомарной операцией "+" складывать два ряда Фурье и операцией "*" перемножать. Потом при массовой обработке человеку обязательно захочется написать:
"#pragma omp parallel for reduction(*: <первый ряд Фурье>, <второй ряд Фурье> ...)"
bess
unregistered
Ответить
b
bess unregistered
17 лет назад / 20 марта 2008 19:56
Хмм

> В языке С вызов функции "()" трактуется как обычная операция типа "+" или "=". Авторы OpenMP почему-то не задумались о возможности редукции таких операций

То-то и странно. Причём не просто не задумались, но и продолжиди игнорировать этот вопрос в последующих версиях (в 2.5 этого по-прежнему нет).

> Хотите или не хотите, но синтаксис, семантику и традиции языка необходимо было учитывать.

Это слишком общее замечание. Всё-таки дело у них в какой-то конкретной проблеме. А в какой именно - мы в этом пока не разобрались ...
Ваш ответ:

Нет значка Нет значка Вот тут! Лампочка Восклицание Вопрос Класс! Улыбка Злость Огорчение Поговорим? Краснею Подмигивание Ругаю ОдобряюBIUdelSxsupxsuboffsp spoilerqurlimgvideo• list1. list1 codeprecenter-hr-rusQWE→ЙЦУ
файлыочистить
Ваше имя: Авторизуйтесь Предпросмотр В полную форму
вставить выделенную цитату в окно ответа
Если Вы считаете это сообщение ценным для дискуссии (не обязательно с ним соглашаться), Вы можете поблагодарить его автора, а также перечислить ему на счет некоторую сумму со своего баланса (при отзыве благодарности перечисленная сумма не будет вам возвращена).
Также вы можете оценить сообщение как неудачное.
В течение суток можно 20 раз оценить сообщения разных участников (купите Premium-аккаунт, либо оплачивайте оценки сверх лимита).
Если Вы считаете это сообщение ценным для дискуссии (не обязательно с ним соглашаться), Вы можете поблагодарить его автора, а также перечислить ему на счет некоторую сумму со своего баланса (при отзыве благодарности перечисленная сумма не будет вам возвращена).
Также вы можете оценить сообщение как неудачное.
В течение суток можно 20 раз оценить сообщения разных участников (купите Premium-аккаунт, либо оплачивайте оценки сверх лимита).
Страницы:Кликните, чтобы указать произвольную страницу12далее