Добавление средств управления к кадру в userform Excel с VBA

Я Прадип и один из разработчиков ArrayFire.

Во-первых, все бэкэнды функций ArrayFire (CUDA и OpenCL) имеют некоторую стоимость запуска, которая включает прогрев устройства и / или кэширование ядра (ядра кэшируются при первом вызове определенной функции). По этой причине вы замечаете лучшее время выполнения после первого запуска. Это также является причиной, по которой мы почти всегда настоятельно рекомендуем использовать встроенную функцию timeit для определения времени кода массива, поскольку он усредняется по ряду прогонов, а не по первому прогону.

Как вы уже поняли из своих экспериментов, всегда лучше держать закрепленные распределения памяти контролируемым образом. Если вы еще не знаете о компромиссах, возникающих при использовании закрепленной памяти, вы можете начать с этого поста в блоге от NVIDIA (в равной степени это относится к закрепленной памяти из бэкэнда OpenCL, с любыми специфическими ограничениями, конечно, для разных поставщиков). ). Общее руководство, предложенное в сообщении с гиперссылкой, выглядит следующим образом:

Не следует чрезмерно выделять закрепленную память. Это может снизить общую производительность системы, поскольку уменьшает объем физической памяти, доступной операционной системе и другим программам. Слишком много сложно сказать заранее, поэтому, как и во всех оптимизациях, протестируйте свои приложения и системы, на которых они работают, на предмет оптимальных параметров производительности.

blockquote>

Если возможно, я бы выбрал следующий путь, чтобы использовать закрепленную память для ваших БПФ

  1. Инкапсулировать закрепленные распределения / освобождения в формате RAII, который вы уже сейчас делаете из Ваше отредактированное описание.
  2. Делайте закрепленное выделение памяти только один раз, если это возможно, если ваш размер данных статичен.

Кроме них, я думаю, что ваша функция неверна в двух отношениях. Я перейду к функции в порядке строк.

af :: af_cdouble * device_ptr = af :: pinned (signal.size ());

blockquote>

Этот вызов не выделяет память на устройстве / графическом процессоре. Это заблокированная страница памяти на хосте, RAM.

af :: array s (signal.size (), device_ptr, afDevice);

blockquote>

Поскольку af :: pinned не выделяет память устройства, он не является устройством указатель и перечисление afHost. Таким образом, вызов будет af::array s(signal.size(), ptr);

Вы сами используете s.write правильно, но я считаю, что это не нужно в вашем случае использования.

Следующее, что я буду делать.

  • Использовать конструкцию RAII для указателя, возвращенного af::pinned, и выделить его только один раз. Убедитесь, что у вас не слишком много этих заблокированных страниц.
  • Используйте распределение с блокировкой страницы в качестве обычного распределения хоста вместо std::vector, потому что это память хоста, просто блокировка страницы. Это потребует написания дополнительного кода на стороне вашего хоста, если вы работаете на std::vector каким-либо образом. В противном случае вы можете просто использовать RAIIed-закрепленный указатель для хранения ваших данных.
  • Все, что вам нужно сделать, это перенести ваши данные БПФ на устройство: af::array s(size, ptr)

При этом операции, которые вам потребуются во времени, будут перенесены с закрепленной памяти на графический процессор, последний вызов в приведенном выше списке; исполнение fft; скопировать обратно на хост.

12
задан Gaffi 26 July 2012 в 03:23
поделиться

2 ответа

Следующий код демонстрирует, как можно динамично заполнить кадр в userform со средствами управления...

В форме, которую я использовал, у меня было управление кадром по имени Frame1, таким образом, в UserForm_Initialize Вы называете Frame1. Средства управления. Добавьте для встраивания управления в кадр. Можно установить управление, которое возвращается к контрольной переменной WithEvents, которую Вы определили в модуле кода UserForm, таким образом, можно ответить на события на любых средствах управления, которые Вы хотите...

Таким образом с этим методом необходимо предварительно записать любой код события, который Вы хотите для любых средств управления, которые Вы создаете...

Также обратите внимание, что можно расположить и измерить средства управления, даже если вершина, левая, ширина и свойства высоты, не обязательно подходит в intellisense...

Private WithEvents Cmd As MSForms.CommandButton
Private WithEvents Lbl As MSForms.Label

Private Sub UserForm_Initialize()
    Set Lbl = Frame1.Controls.Add("Forms.Label.1", "lbl1")
    Lbl.Caption = "Foo"
    Set Cmd = Frame1.Controls.Add("Forms.CommandButton.1", "cmd1")
End Sub

Private Sub Cmd_Click()
    Cmd.Top = Cmd.Top + 5
End Sub

Private Sub Lbl_Click()
    Lbl.Top = Lbl.Top + 5
End Sub
18
ответ дан 2 December 2019 в 07:04
поделиться

Моя вариация на тему выше. Это только для набора кнопок 4x4. Создайте пользовательскую форму и добавьте ее в свой код. Те же самые концепции можно использовать с вашими ярлыками (или посмотрите предыдущий ответ):

Private cmdLots(20) As MSForms.CommandButton

Private Sub UserForm_Initialize()
For i = 1 To 4
For j = 1 To 4
    k = i + (4 * j)
    Set cmdLots(k) = UserForm2.Controls.Add("Forms.CommandButton.1", "cmd1")
    With cmdLots(k)
        .Top = i * 25
        .Left = (j * 80) - 50
        .BackColor = RGB(50 * i, 50 * j, 0)
        .Caption = "i= " & i & "  j= " & j
    End With
Next j
Next i
End Sub
4
ответ дан 2 December 2019 в 07:04
поделиться
Другие вопросы по тегам:

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