Очень быстрый memcpy для обработки изображений?

у кого-либо есть лучший путь?

я думаю, просто добавив, что сценарий к телу был бы легче тогда добавление его к последнему узлу на странице. Как насчет этого:

function include(url) {
  var s = document.createElement("script");
  s.setAttribute("type", "text/javascript");
  s.setAttribute("src", url);
  document.body.appendChild(s);
}
32
задан starblue 12 November 2009 в 18:42
поделиться

5 ответов

Предоставлено Уильямом Чаном и Google. На 30-70% быстрее, чем memcpy в Microsoft Visual Studio 2005.

void X_aligned_memcpy_sse2(void* dest, const void* src, const unsigned long size)
{

  __asm
  {
    mov esi, src;    //src pointer
    mov edi, dest;   //dest pointer

    mov ebx, size;   //ebx is our counter 
    shr ebx, 7;      //divide by 128 (8 * 128bit registers)


    loop_copy:
      prefetchnta 128[ESI]; //SSE2 prefetch
      prefetchnta 160[ESI];
      prefetchnta 192[ESI];
      prefetchnta 224[ESI];

      movdqa xmm0, 0[ESI]; //move data from src to registers
      movdqa xmm1, 16[ESI];
      movdqa xmm2, 32[ESI];
      movdqa xmm3, 48[ESI];
      movdqa xmm4, 64[ESI];
      movdqa xmm5, 80[ESI];
      movdqa xmm6, 96[ESI];
      movdqa xmm7, 112[ESI];

      movntdq 0[EDI], xmm0; //move data from registers to dest
      movntdq 16[EDI], xmm1;
      movntdq 32[EDI], xmm2;
      movntdq 48[EDI], xmm3;
      movntdq 64[EDI], xmm4;
      movntdq 80[EDI], xmm5;
      movntdq 96[EDI], xmm6;
      movntdq 112[EDI], xmm7;

      add esi, 128;
      add edi, 128;
      dec ebx;

      jnz loop_copy; //loop please
    loop_copy_end:
  }
}

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

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

40
ответ дан 27 November 2019 в 20:31
поделиться

На любом уровне оптимизации -O1 или выше GCC будет использовать встроенные определения для таких функций, как memcpy - с правильным параметром -march ( -march = pentium4 для упомянутого вами набора функций) он должен генерировать довольно оптимальный встроенный код для конкретной архитектуры.

Я бы проверил его и посмотрел, что получится.

6
ответ дан 27 November 2019 в 20:31
поделиться

Если используется только для процессоров Intel, вы можете воспользоваться IPP . Если вы знаете, что он будет работать с графическим процессором Nvidia, возможно, вы могли бы использовать CUDA - в обоих случаях может быть лучше смотреть шире, чем оптимизация memcpy () - они предоставляют возможности для улучшения вашего алгоритма на более высоком уровне. Однако они оба зависят от определенного оборудования.

3
ответ дан 27 November 2019 в 20:31
поделиться

Если вы работаете в Windows, используйте API DirectX , в которых есть специальные GPU -оптимизированные процедуры для обработки графики (насколько быстро это может быть ? Ваш ЦП не загружен. Сделайте что-нибудь еще, пока ГП его ест).

Если вы хотите быть независимым от ОС, попробуйте OpenGL .

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

2
ответ дан 27 November 2019 в 20:31
поделиться

SSE-код, опубликованный hapalibashi, - это то, что вам нужно.

Если вам нужна еще большая производительность и не уклоняйтесь от долгого и извилистого пути написания драйвера устройства : Все важные платформы в настоящее время имеют DMA-контроллер, который может выполнять копирование быстрее и параллельно с кодом процессора.

Однако это требует написания драйвера. Ни одна большая ОС, о которой я знаю, не предоставляет эту функциональность пользователю из-за рисков безопасности.

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

6
ответ дан 27 November 2019 в 20:31
поделиться
Другие вопросы по тегам:

Похожие вопросы: