Pull to refresh
23
0
Marat Dukhan@Maratyszcza

User

Send message
Это MSVC и intrinsics. SIMD intrinsics поддерживаются всеми приличными компиляторами одинаково, а вот не-SIMD тоже поддерживаются, но у каждого компилера называются по-своему.
Я не против, посмотрите =)
На дворе уже почти 2012 год, и не использовать SIMD в HPC коде есть преступление!

#include <intrin.h>

const char* find_digit(const char* str) {
    static const __m128i str_mask[16] = {
        _mm_set_epi32(0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF),
        _mm_set_epi32(0x00FFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF),
        _mm_set_epi32(0x0000FFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF),
        _mm_set_epi32(0x000000FF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF),
        _mm_set_epi32(0x00000000, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF),
        _mm_set_epi32(0x00000000, 0x00FFFFFF, 0xFFFFFFFF, 0xFFFFFFFF),
        _mm_set_epi32(0x00000000, 0x0000FFFF, 0xFFFFFFFF, 0xFFFFFFFF),
        _mm_set_epi32(0x00000000, 0x000000FF, 0xFFFFFFFF, 0xFFFFFFFF),
        _mm_set_epi32(0x00000000, 0x00000000, 0xFFFFFFFF, 0xFFFFFFFF),
        _mm_set_epi32(0x00000000, 0x00000000, 0x00FFFFFF, 0xFFFFFFFF),
        _mm_set_epi32(0x00000000, 0x00000000, 0x0000FFFF, 0xFFFFFFFF),
        _mm_set_epi32(0x00000000, 0x00000000, 0x000000FF, 0xFFFFFFFF),
        _mm_set_epi32(0x00000000, 0x00000000, 0x00000000, 0xFFFFFFFF),
        _mm_set_epi32(0x00000000, 0x00000000, 0x00000000, 0x00FFFFFF),
        _mm_set_epi32(0x00000000, 0x00000000, 0x00000000, 0x0000FFFF),
        _mm_set_epi32(0x00000000, 0x00000000, 0x00000000, 0x000000FF)
    };
    static const __m128i str_offset = _mm_set1_epi8(127 - '9');
    static const __m128i str_threshold = _mm_set1_epi8(127 - 10);
    const size_t str_misalignment = ((size_t)str) & ((size_t)15);
    const __m128i* str_aligned = (const __m128i*)(((size_t)str) - str_misalignment);
    __m128i str_vector = _mm_load_si128(str_aligned);
    str_vector = _mm_and_si128(str_vector, str_mask[str_misalignment]);
    str_vector = _mm_add_epi8(str_vector, str_offset);
    int str_bitmask = _mm_movemask_epi8(_mm_cmpgt_epi8(str_vector, str_threshold));
    unsigned long index;
    _BitScanForward(&index, str_bitmask);
    while (str_bitmask == 0) {
        str_aligned += 1;
        str_vector = _mm_load_si128(str_aligned);
        str_vector = _mm_add_epi8(str_vector, str_offset);
        str_bitmask = _mm_movemask_epi8(_mm_cmpgt_epi8(str_vector, str_threshold));
        _BitScanForward(&index, str_bitmask);
    }
    return ((const char*)str_aligned) + index;
}
Эээ… а что же там тогда есть, кроме разукрашенного эклипса?
Использование goto для перехода на обработчик ошибок — стандартная практика в C коде. Хотя код автора и на C++, написан он в стиле C.
Сайты не взломали, а заддосили
У Radeon 5850 всего 18 независимых процессоров (simd cores). Учитывая их частоту в 725 MHz они едва ли выигрывают у 6-ядерного Phenom на 3.2 GHz только за счёт числа.
Тогда за счёт чего ускорение на GPU? GPU не дружат с условными ветвлениями
На SIMD переносить пробовали?
GetExceptionCode()->ExceptionRecord->ExceptionAddress будет содержать адрес инструкции, следующей за инструкцией, которая вызвала исключение. Отмапить его в имя функции (и даже номер строчки кода) можно с помощью Debug Help Library. Естественно, программа должна быть собрана с отладочной инфой.
Приведённый вами код, конечно, лучше, чем версия автора поста, но тоже работает неправильно, т.к. не обрабатывает модификаторы букв. Например, он выдаст strrev(«über») = «reb̈u» если исходная строка была в денормализованной форме. Но даже если вы всё же научите алгоритм не переворачивать модификаторы, останутся другие проблемы. Например, должна ли концевая буква мем 'ם' преобразовываться в обычную мем 'מ', если мы переворачиваем слово и эта буква становится первой? Или что делать с модификаторами направления письма (слева-направо/справо-налево) при обращении строки? Чтобы ответить на эти вопросы нужно ответить на вопрос «Зачем на переворачивать строку». И когда вы пытаетесь ответить на этот вопрос, вы понимаете, что на самом деле операция переворачивания строки вам не нужна, просто в вашем классе String нет метода lastIndexOf и вы думали сделать что-то вроде string.reverse().indexOf(substring.reverse()). Так вот, не стоит этого делать. Просто добавьте в класс String метод, которые делает действительно то, что вам нужно.
Для Юникодной строки невозможно разумно определить операцию переворачивания. И в нормальных фреймворках операция переворачивания строки не нужна.
Для размышления — классическая задача: «Переверните C-строку (имеется в виду, что “abcd” – это пять символов, пятый – завершающий нуль-символ ‘\0’)».

Юникод? Не, не слышали.
Не требуется. Антимонопольные органы могут начать расследование и сами
Звучит как «640 килобайт хватит всем!». Если вам не нужно много ресурсов, то виртуальный сервер обойдётся вам дешевле выделенного на ARM, так что последние смысла не имеют.
Пока ARM не станет 64-битной архитектурой серверов на ней не будет
Остаётся только добавить, что предыдущий рекорд в 8308.94 MHz был достигнут на Intel Celeron 352 — урезанном варианте Pentium 4 на 65 нм

Information

Rating
Does not participate
Location
Atlanta, Georgia, США
Registered
Activity