Модераторы: Daevaorn

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> switch в compile-time, Избежать большой вложенности 
:(
    Опции темы
W4FhLF
Дата 12.10.2010, 11:04 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


found myself
****


Профиль
Группа: Участник Клуба
Сообщений: 2831
Регистрация: 2.12.2006

Репутация: 20
Всего: 121



Не знаю как тему назвать.

У меня есть два параметра. Для заданного диапазона значений этих параметров нужно сгенерировать процедуры в compile-time! Сразу скажу, что прога работает на GPU, поэтому цель вынести как можно больше вычислений в compile-time (чтобы компилятор мог развернуть циклы), размер полученного объектника не имеет никакого значения. 

Имеет смысл заюзать шаблоны. Самая "тупая" реализация, которая написана на первое время выглядит так:

Код

    switch(CSize * RSize)
    {
        case 81:
            processingKernelTex<9, 9>(d_Dst, columns, rows);
            break;
        case 99:
            processingKernelTex<11, 9>(d_Dst, columns, rows);
            break;
        case 169:
            processingKernelTex<13, 13>(d_Dst, columns, rows);
            break;
        case 285:
            processingKernelTex<19, 15>(d_Dst, columns, rows);
            break;
    }


Очевидно, что она не подходит хотя бы потому что произведение коммутативная операция. Т.е. для пары параметров 11, 9:
11 * 9 = 99 = 9 * 11 = 99. А вычисления для (11, 9) и (9, 11) должны быть разные!

Я знаю диапазоны изменения эти параметров и хочу для каждой пары сгенерировать свою реализацию. Есть идеи? 

Это сообщение отредактировал(а) W4FhLF - 12.10.2010, 11:24


--------------------
"Бог умер" © Ницше
"Ницше умер" © Бог
PM ICQ   Вверх
azesmcar
Дата 12.10.2010, 11:12 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


uploading...
****


Профиль
Группа: Участник Клуба
Сообщений: 6291
Регистрация: 12.11.2004
Где: Армения

Репутация: 81
Всего: 211



W4FhLF

А сами параметры известны в compile-time?
PM   Вверх
boostcoder
Дата 12.10.2010, 11:13 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


pattern`щик
****


Профиль
Группа: Завсегдатай
Сообщений: 5458
Регистрация: 1.4.2010

Репутация: 49
Всего: 110



PM WWW   Вверх
W4FhLF
Дата 12.10.2010, 11:23 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


found myself
****


Профиль
Группа: Участник Клуба
Сообщений: 2831
Регистрация: 2.12.2006

Репутация: 20
Всего: 121



Цитата(azesmcar @  12.10.2010,  11:12 Найти цитируемый пост)
А сами параметры известны в compile-time?


Они передаются параметрами (CSize, RSize) в функцию. Мне лишь известно, что они меняются в диапазоне 5-25 скажем. Т.е. может быть 400 комбинаций, для switch'a многовато и к тому же поскольку параметров два нужно писать вложенный switch. 

boostcoder, boost'a под этот компилятор (NVIDIA C/C++ Compiler) нет. А залазить в MPL самому страшно  smile 


--------------------
"Бог умер" © Ницше
"Ницше умер" © Бог
PM ICQ   Вверх
boostcoder
Дата 12.10.2010, 11:26 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


pattern`щик
****


Профиль
Группа: Завсегдатай
Сообщений: 5458
Регистрация: 1.4.2010

Репутация: 49
Всего: 110



Цитата(W4FhLF @  12.10.2010,  11:23 Найти цитируемый пост)
boostcoder, boost'a под этот компилятор (NVIDIA C/C++ Compiler) нет. А залазить в MPL самому страшно

if_<> написать запросто smile

Добавлено через 53 секунды
Цитата(W4FhLF @  12.10.2010,  11:23 Найти цитируемый пост)
boost'a под этот компилятор (NVIDIA C/C++ Compiler) нет

кстати, пробовал?
PM WWW   Вверх
mes
Дата 12.10.2010, 11:29 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


любитель
****


Профиль
Группа: Участник Клуба
Сообщений: 7954
Регистрация: 14.1.2006

Репутация: 144
Всего: 250



Цитата(W4FhLF @  12.10.2010,  10:04 Найти цитируемый пост)
 А вычисления для (11, 9) и (9, 11) должны быть разные!


Цитата(W4FhLF @  12.10.2010,  10:23 Найти цитируемый пост)
Мне лишь известно, что они меняются в диапазоне 5-25 скажем.

Код

switch( (c-5)*20+(r-5) )
или
array [ (c-5)*20+(r-5)] ();



Это сообщение отредактировал(а) mes - 12.10.2010, 11:32


--------------------
PM MAIL WWW   Вверх
djamshud
Дата 12.10.2010, 11:30 (ссылка) |    (голосов:1) Загрузка ... Загрузка ... Быстрая цитата Цитата


Пердупержденный
***


Профиль
Группа: Завсегдатай
Сообщений: 1655
Регистрация: 23.11.2009

Репутация: 8
Всего: 39



Можно сделать матрицу своих шаблонных колбеков. X и Y координаты - это соответственно значения первого и второго патаметров. К нам попадает пара значений - сразу вызываем обработчик.

Если диапазоны параметров XY не пересекаются, то можно существенно сократить матрицу, сделав X и Y соотвественно диапазонами этих параметров (т.е. 9..13, 13..19 и т.д.) - в таком случае к нам падает пара значений, находим к каким диапазонам они относятся, вызываем ячейку, им соответствующую.

У вас параметры неизвестны в компайл-тайм, так что о полноценной компайл-тайм реализации речи идти не может.

Добавлено через 2 минуты и 52 секунды
Всякие шаблонные if опять же работает только для заранее известных значений.


--------------------
'Cuz I never walk away from what I know is right
Alice Cooper - Freedom
PM   Вверх
W4FhLF
Дата 12.10.2010, 11:33 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


found myself
****


Профиль
Группа: Участник Клуба
Сообщений: 2831
Регистрация: 2.12.2006

Репутация: 20
Всего: 121



Цитата(boostcoder @  12.10.2010,  11:26 Найти цитируемый пост)
if_<> написать запросто 


Я учту, спасибо. 

Юзать буст там не пробовал. Они в последний год только начали добавлять поддержку С++ features, но всё равно очень многое из стандарта отсутствует. 


mes, а что с этим делать?

Добавлено @ 11:37
Цитата(djamshud @  12.10.2010,  11:30 Найти цитируемый пост)
Можно сделать матрицу своих шаблонных колбеков. X и Y координаты - это соответственно значения первого и второго патаметров. К нам попадает пара значений - сразу вызываем обработчик.


А в ячейках хранить указатели на обработчики? Я к сожалению не могу вызывать функции по указателю (хотя эта возможность была добавлена в последнюю версию компилятора, но я юзаю предыдущую), но можно сделать доп. обёртку, в таком случае такой вариант подойдёт. Но мне обработчики вручную генерить? 

Цитата(djamshud @  12.10.2010,  11:30 Найти цитируемый пост)
У вас параметры неизвестны в компайл-тайм, так что о полноценной компайл-тайм реализации речи идти не может.


Да, но я не против, чтобы компилятор сгенерил все возможные варианты. smile Главное чтоб не вручную это делать. 


Это сообщение отредактировал(а) W4FhLF - 12.10.2010, 11:40


--------------------
"Бог умер" © Ницше
"Ницше умер" © Бог
PM ICQ   Вверх
mes
Дата 12.10.2010, 11:38 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


любитель
****


Профиль
Группа: Участник Клуба
Сообщений: 7954
Регистрация: 14.1.2006

Репутация: 144
Всего: 250



Вам надо для всех 400 вариантов задать функцию, которая представлена шаблоном основывающимся на "координатах" CSize, RSize ?

или я неправильно понял задачу ?


--------------------
PM MAIL WWW   Вверх
W4FhLF
Дата 12.10.2010, 11:41 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


found myself
****


Профиль
Группа: Участник Клуба
Сообщений: 2831
Регистрация: 2.12.2006

Репутация: 20
Всего: 121



Цитата(mes @  12.10.2010,  11:38 Найти цитируемый пост)
Вам надо для всех 400 вариантов задать функцию, которая представлена шаблоном основывающимся на "координатах" CSize, RSize ?


Мне надо задать 400 функций для всех комбинаций параметров CSize, RSize. 


--------------------
"Бог умер" © Ницше
"Ницше умер" © Бог
PM ICQ   Вверх
djamshud
Дата 12.10.2010, 11:42 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Пердупержденный
***


Профиль
Группа: Завсегдатай
Сообщений: 1655
Регистрация: 23.11.2009

Репутация: 8
Всего: 39



W4FhLF, так может проще просто сгенерировать мега-свитч?


--------------------
'Cuz I never walk away from what I know is right
Alice Cooper - Freedom
PM   Вверх
W4FhLF
Дата 12.10.2010, 11:43 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


found myself
****


Профиль
Группа: Участник Клуба
Сообщений: 2831
Регистрация: 2.12.2006

Репутация: 20
Всего: 121



djamshud, писать внешний скрипт для этого? Буду это делать в том случае, если средствами языка и препроцессора не решу. 

Это сообщение отредактировал(а) W4FhLF - 12.10.2010, 11:44


--------------------
"Бог умер" © Ницше
"Ницше умер" © Бог
PM ICQ   Вверх
mes
Дата 12.10.2010, 11:54 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


любитель
****


Профиль
Группа: Участник Клуба
Сообщений: 7954
Регистрация: 14.1.2006

Репутация: 144
Всего: 250



Цитата(W4FhLF @  12.10.2010,  10:41 Найти цитируемый пост)
Мне надо задать 400 функций для всех комбинаций параметров CSize, RSize.  

вот набросок на скорую руку  : http://liveworkspace.org/code/113cae60cbf8...b9bd90b3c193ec8
 ловите, и допиливаете под свои нужды smile 



--------------------
PM MAIL WWW   Вверх
W4FhLF
Дата 12.10.2010, 12:13 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


found myself
****


Профиль
Группа: Участник Клуба
Сообщений: 2831
Регистрация: 2.12.2006

Репутация: 20
Всего: 121



mes, да, то что нужно! Спасибо большое. smile 


--------------------
"Бог умер" © Ницше
"Ницше умер" © Бог
PM ICQ   Вверх
mes
Дата 12.10.2010, 12:47 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


любитель
****


Профиль
Группа: Участник Клуба
Сообщений: 7954
Регистрация: 14.1.2006

Репутация: 144
Всего: 250



Цитата(W4FhLF @  12.10.2010,  10:23 Найти цитируемый пост)
 в диапазоне 5-25 скажем. Т.е. может быть 400 комбинаций,

скорее всего  опечатка, но на всякий случай уточню ..  в данном диапазоне 442smile 441 вариант... 
и тогда не 20
Код

(c-5)*20+(r-5)

а 21
smile

а вместо одномерного массива как в примере. можно использовать двухмерный, для лучшей читабельности..

Это сообщение отредактировал(а) mes - 12.10.2010, 12:52


--------------------
PM MAIL WWW   Вверх
Ответ в темуСоздание новой темы Создание опроса
Правила форума "С++:Общие вопросы"
Earnest Daevaorn

Добро пожаловать!

  • Черновик стандарта C++ (за октябрь 2005) можно скачать с этого сайта. Прямая ссылка на файл черновика(4.4мб).
  • Черновик стандарта C (за сентябрь 2005) можно скачать с этого сайта. Прямая ссылка на файл черновика (3.4мб).
  • Прежде чем задать вопрос, прочтите это и/или это!
  • Здесь хранится весь мировой запас ссылок на документы, связанные с C++ :)
  • Не брезгуйте пользоваться тегами [code=cpp][/code].
  • Пожалуйста, не просите написать за вас программы в этом разделе - для этого существует "Центр Помощи".
  • C++ FAQ

Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Earnest Daevaorn

 
1 Пользователей читают эту тему (1 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | C/C++: Общие вопросы | Следующая тема »


 




[ Время генерации скрипта: 0.0833 ]   [ Использовано запросов: 21 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.