2014 dxdy logo

Научный форум dxdy

Математика, Физика, Computer Science, Machine Learning, LaTeX, Механика и Техника, Химия,
Биология и Медицина, Экономика и Финансовая Математика, Гуманитарные науки




Начать новую тему Ответить на тему
 
 Ограничение выхода за диапазон [CUDA, C]
Сообщение24.12.2013, 15:53 


16/08/13
4
Здравсвуйте.
Пишу программу на CUDA C для исполнения на видеокарте ( параллельное программирование ), которая занимается обработкой изображений. Одна из особенной программирования на CUDA - крайне нежелательно использовать операторы условия.
Например для выполнения порогового преобразования пикселя, который принимает значения от 0 до 255. Вместо:
Код:
#define MAX 255
#define MIN 0
#define THRESHOLD 127
int x = 17;
if( x > THRESHOLD )
    x = MAX;
else
    x = MIN;

Используется:
Код:
int x = 17;
...
x = x / THRESHOLD;
x = x * MAX;

Оператор if-else заменен арифметическими операциями.
Это дает ускорение вычислений. Это особенность программирования в CUDA.

Возможно ли то же самое проделать для контроля выхода значения индекса пикселя за пределы изображения. Т.е. если изображения имеет размер 50 на 50 пикселей, как определить, что значение x, хранящее индекс пикселя не вышло за границы изображения, не используя оператор if, а арифметические операторы, пусть и несколько:
Код:
if( x<0 )
    x = 0;
if( x>49 )
    x = 49;

Нужно это для обработки краев изображения при его свертке ядром. Спасибо)

 Профиль  
                  
 
 Re: Ограничение выхода за диапазон.
Сообщение24.12.2013, 16:12 


05/09/12
2587
Имхо, будет суровое ускорение вычислений, когда целой переменной присваивается значение $17/127$, а потом полученный результат (угадайте, какой) умножается на $255$. А во флоаты переводить - тоже не способствует уменьшению количества операций.

ЗЫ сравнение всегда производится с нулем - по значению знакового бита (и при целых и при флоатах). Давайте вы напишете нормальный код без условий для вашего первого случая, а после можно подумать над другими.

 Профиль  
                  
 
 Re: Ограничение выхода за диапазон.
Сообщение24.12.2013, 17:12 
Заслуженный участник


12/08/10
1680
мм а $\frac{x+|x|}{2}$ можно считать?

 Профиль  
                  
 
 Re: Ограничение выхода за диапазон.
Сообщение24.12.2013, 21:56 


16/08/13
4
так можно проводить коррекцию по нижнему краю ( -1 --> 0 ). По верхнему краю ( 51 --> 50 ) - нет.
Более строгая формулировка того, что хотелось бы получить на фото по ссылке (не нашел, как прикреплять файл ) :
http://files.mail.ru/F759219EEE2D4E6AA2A41594164F32D1

-- 24.12.2013, 22:59 --

_Ivana в сообщении #805524 писал(а):
Имхо, будет суровое ускорение вычислений, когда целой переменной присваивается значение $17/127$, а потом полученный результат (угадайте, какой) умножается на $255$. А во флоаты переводить - тоже не способствует уменьшению количества операций.

Я и не перевожу во флоаты. Целочисленное 17, поделенное на 255 дает 0. 0 * 255 = 0. Т.е. все, что меньше THRESHOLD становится нулем, все что больше, становится MAX.

 Профиль  
                  
 
 Re: Ограничение выхода за диапазон.
Сообщение24.12.2013, 23:21 


05/09/12
2587
Almaz1988 в сообщении #805692 писал(а):
так можно


Используется синтаксис Matlab M
function main()
    clf reset;
    x = -20:100;
    set(plot(x, gate(x, 20, 70), '-b'), 'LineWidth', 3);
    grid on
    axis equal
end

function y = gate(x, l, r)
    y = x - r;
    y = (y - abs(y))./2;
    y = y + r - l;
    y = (y + abs(y))./2;
    y = y + l;
end


Изображение

 Профиль  
                  
Показать сообщения за:  Поле сортировки  
Начать новую тему Ответить на тему  [ Сообщений: 5 ] 

Модераторы: Karan, Toucan, PAV, maxal, Супермодераторы



Кто сейчас на конференции

Сейчас этот форум просматривают: нет зарегистрированных пользователей


Вы не можете начинать темы
Вы не можете отвечать на сообщения
Вы не можете редактировать свои сообщения
Вы не можете удалять свои сообщения
Вы не можете добавлять вложения

Найти:
Powered by phpBB © 2000, 2002, 2005, 2007 phpBB Group