Почему NVIDIA Pascal имеет ядра FP32 и FP64? Почему я не могу использовать их одновременно?

Я пытаюсь понять архитектуру GPU Nvidia, но я немного застрял на чем-то, что кажется довольно простым. Каждый потоковый Многопроцессор в Pascal состоит из ядер 64xFP32 и 32xFP64. И вот два моих вопроса:

  • почему Nvidia поместила оба FP32 и FP64 устройства в чип? Почему не как раз положить блоки FP64 которые способны выполнять деятельности 2xFP32 в инструкцию (как комплекты инструкции SIMD в C. P. U.).
  • почему я не могу использовать все Блоки FP32 и FP64 в тоже время?

Я думаю, что оба являются аппаратными решениями дизайна, но я хотел бы узнать более подробную информацию об этой теме. Любая информация об этом более чем приветствуется!

EDIT1:

  • Если возможно сделать FP32 и FP64 одновременно, означает ли это, что графический процессор с 8TFLOPS SP и 4TFLOPS DP может дать вам (теоретически) 12 TFLOPS смешанных TFLOPS?
    • в случае CUDA, как это достигается? Я просто использую удваивается и плавает одновременно в моем ядре? Или мне нужно передать какой-то флаг NVCC?
11
задан AstrOne
03.01.2023 18:10 Количество просмотров материала 2531
Распечатать страницу

1 ответ

почему Nvidia поместила оба FP32 и FP64 устройства в чип?

Я думаю, что о проникновении на рынок, чтобы продать как можно больше. Без FP64 научные исследователи не могут даже попробовать демо-версию научно важного программного обеспечения gpgpu, которое использует FP64(и даже игры могут использовать двойную точность по случаю). Без FP32 физика и моделирование игр будут очень медленными, или GPU понадобится ядерный реактор. Без FP16 нет быстрой нейронной сети. Если были только FP32, моделирование нейронной сети будет работать с половинной скоростью, или некоторое суммирование FP64 не будет работать.

кто знает, может быть, в будущем не будет FP_raytrace выделенные ядра, которые делают трассировку ультра быстро, так что не более DX12 DX11 DX9 болезненные обновления и лучшую графику.

В конечном счете, я бы не сказал " Нет " для GPU на основе FPGA, который может конвертировать некоторые ядра из FP64 в FP32 или некоторые специальные функциональные ядра для приложения, а затем конвертировать все в FP64 для другое приложение и даже преобразование всего в одно ядро fat, которое выполняет последовательную работу (например, компиляцию шейдеров). Это принесет пользу для людей, которые делают много разных вещей на компьютере. Например, мне может понадобиться больше умножений, чем могут помочь дополнения и FPGA. Но теперь деньги говорят, и он говорит "фиксированная функция сейчас", и лучший доход достигается со смесью FP64 и FP32 (и FP16 в последнее время).

почему не как раз положить блоки FP64 которые возможность выполнения операций 2xFP32 на инструкцию (как наборы инструкций SIMD в ЦП).

SIMD ожидает всегда одну и ту же операцию для нескольких данных и меньше удовольствия для скалярных ядер GPGPU. Также 2xFP32 из FP64 потребуется больше транзисторов, чем чистый FP64, больше тепла, больше задержка может быть.

больше транзисторов = больше вероятность отказа производства, так что 1024 FP32 GPU может быть более вероятно, чем 512 FP64_flexible GPU.

почему я не могу использовать все блоки FP32 и FP64 одновременно?

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

ответ Для редактирования 1:

вот подробный источник http://www.nvidia.com/content/PDF/sc_2010/CUDA_Tutorial/SC10_Accelerating_GPU_Computation_Through_Mixed-Precision_Methods.pdf

короче говоря, они не добавляют, есть "убывающая отдача", которая каким-то образом не позволяет масштабировать %100 на всех ядрах из-за необходимых" дополнительных циклов " между различными точными вычислениями. Когда они не смешиваются, то им нужны "дополнительные итерации" между блоками, которые также не позволяют масштабировать %100. Кажется, это более полезно как превышение скорости "FP64" вместо "FP32" вниз(но имеющих несколько ядер FP64 следует beneficious(для повысит FP32), вы можете проверить их с чем-то вроде ядра nbody (которая является достаточно производительная память)). FP64 очень много памяти (и строки кэша (и локальная память)), поэтому nbody alorithm я предложил, который повторно использует некоторые данные для N (>64k, например) раз. Мой GPU имеет мощность 1/24 FP64, поэтому я не доверяю своему компьютеру. У тебя есть титан? Вы должны попробовать, возможно, его имея %50 больше энергии, чем его значение объявления GFLOPs.(но значение TDP рекламы смогло ограничивать свою частоту тот путь, и плавит вниз)

этот источник: http://www.nvidia.com/content/nvision2008/tech_presentations/NVIDIA_Research_Summit/NVISION08-Mixed_Precision_Methods_on_GPUs.pdf

говорит "выдающаяся производительность и точность", но я не мог найти физический решатель для игр с использованием FP32 + FP32(усеченный FP64), возможно, его деньги снова говорят, если кто-то это сделает, это будет "выдающаяся производительность и обвал" в играх.(может быть, хуже, чем разнесение видеокарты furmark)

люди даже использовать целые числа (целое число, скалярное произведение) сверху плавает здесь : https://devblogs.nvidia.com/parallelforall/mixed-precision-programming-cuda-8/

в случае CUDA, как это достигается? Я просто использую двойные и плавает одновременно в моем ядре? Или мне нужно пройти какое-то флаг для NVCC?

пример для итеративного уточнения с использованием fp64 + fp32 в той же функции:

https://www.sciencesmaths-paris.fr/upload/Contenu/HM2012/07-dongarra_part2.pdf

страницах 26-28.


для части opencl, здесь amd evergreen (серия hd5000) способное выдавать 1dp fma + 1 sp (или 1 sf) каждое цикл.

http://www.microway.com/download/whitepaper/gpgpu_architecture_and_performance_comparison_2010.pdf

я протестирую что-то вроде nbody на моем R7-240, который является 1/24 или 1/26-й мощностью fp32 как fp64 завтра.

Edit: его работа.

__kernel void sumGPU(__global float * a,__global float * b)
{
  int idx = get_global_id(0);
  float a0=a[idx];
  a0+=2.0f;
  a0+=2.0f;
  a0+=2.0f;
  a0+=2.0f;
  a0+=2.0f;
  a0+=2.0f;
  a0+=2.0f;
  a0+=2.0f;
  a0+=2.0f;
  a0+=2.0f;
  a0+=2.0f;
  a0+=2.0f;
  //a0=convert_float(convert_double(a0)+2.0);
  //a0+=2.0f;
  a0+=2.0f;
  a0+=2.0f;
  a0+=2.0f;
  a0+=2.0f;
  a0+=2.0f;
  a0+=2.0f;
  a0+=2.0f;
  a0+=2.0f;
  a0+=2.0f;
  a0+=2.0f;
  a0+=2.0f;
  a0+=2.0f;
  a0+=2.0f;
  a0+=2.0f;
  a0+=2.0f;
  a0+=2.0f;
  a0+=2.0f;
  a0+=2.0f;
  a0+=2.0f;
  a0+=2.0f;
  a0+=2.0f;
  b[idx] = a0;

}   

он переключается между 13.02 МС и 12.85 МС, когда только один из комментариев отключены.


Примечание: сами по себе ядра не fp32. Нет начинка. Существуют планировщики, привязывающие аппаратные ресурсы (fp32,fp64,special_function,registers) к инструкциям ядра потоков. Потоки также не являются реальными потоками. Поэтому, когда вы используете fp32 fp64, то тогда fp32 тогда fp64_square_root, он оставляет необходимые ресурсы, когда они необходимы. В противном случае они являются параметрами для других рабочих элементов.(но один рабочий элемент не может использовать более 1-2 FP32 ALUs, которые я подозреваю (idk, я это сделал))


изменить(2018/03): это FP_raytrace(второй абзац этого ответа выше) становится реальностью?

(NVIDIA) https://www.geforce.com/whats-new/articles/nvidia-rtx-real-time-game-ray-tracing

(AMD) https://www.gamingonlinux.com/articles/amd-has-announced-radeon-rays-an-open-source-ray-tracing-sdk-using-vulkan.11461

или это очередной маркетинговый трюк? Если у него есть аппаратная сторона, то люди raytracer могут работать быстрее, но это не поможет для моба геймер или Рэй-tracerless физики симулятора. Зачем мне платить больше за эти трассировщики лучей, если я собираюсь редактировать некоторые видео? Возможно, они могут быть сегментированы, как и другие, но за большие деньги, вероятно.

2
отвечен huseyin tugrul buyukisik 2023-01-05 01:58

Постоянная ссылка на данную страницу: [ Скопировать ссылку | Сгенерировать QR-код ]

Ваш ответ

Опубликуйте как Гость или авторизуйтесь

Имя
Вверх