2013-11-09 3 views
1

Меня интересует реализация opencl ядра, которая считает множество (1) бит в unsigned int Я знаю, что существует такое расширение для opencl, и я не хочу его использовать, но сам реализуюреализация bitcount в opencl

ответ

0

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

См:

How to count the number of set bits in a 32-bit integer?

http://www.geeksforgeeks.org/count-set-bits-in-an-integer/

http://gurmeet.net/puzzles/fast-bit-counting-routines/

2

Это не точная функция, которую вы ищете. Но поскольку никто не опубликовал OpenCL-код, я добавлю его. Это код подсчета кода OpenCL для 256-битных целых чисел, а не 32 бит по вашему запросу. Код от here. Он использует один из известных алгоритмов, обозначенных Dithermaster. Преобразование в 32-битное не должно быть сложно.

// 
// popcnt256 - return population count for 256-bit value 
// 
uint popcnt256 (ulong4 vreg) 
    { 
    const ulong4 m1 = (ulong4)(0x5555555555555555,0x5555555555555555,0x5555555555555555,0x5555555555555555); 
    const ulong4 m2 = (ulong4)(0x3333333333333333,0x3333333333333333,0x3333333333333333,0x3333333333333333); 
    const ulong4 m4 = (ulong4)(0x0f0f0f0f0f0f0f0f,0x0f0f0f0f0f0f0f0f,0x0f0f0f0f0f0f0f0f,0x0f0f0f0f0f0f0f0f); 
    const ulong4 h01 = (ulong4)(0x0101010101010101,0x0101010101010101,0x0101010101010101,0x0101010101010101); 

    vreg -= (vreg >> 1) & m1; 
    vreg = (vreg & m2) + ((vreg >> 2) & m2); 
    vreg = (vreg + (vreg >> 4)) & m4; 
    vreg = (vreg * h01) >> 56; 
    return vreg.s0 + vreg.s1 + vreg.s2 + vreg.s3; 
    } 
Смежные вопросы