В настоящее время я могу в ЦП (хост) использовать функцию DFT oneMKL для реализации вычислений данных. Но теперь я хочу реализовать операцию ДПФ oneMKL в графическом процессоре устройства. Я пробовал много вещей, но безуспешно. Поэтому я пришел сюда в надежде получить помощь, спасибо! Кстати, я использую язык Intel oneAPI DPC++.
Мое окружение:
Процессор: процессор Intel(R) Core(TM) i7-1065G7;
Графический процессор: Intel(R) Iris(R) Plus Graphics;
ОС: Вин11;
ИДЕ: ВС2022;
OneAPI BaseToolkit: 2024.0.1.45;
Библиотека ядра OneMath: 2024.1.0.696;
Я попытался инкапсулировать настройки DFT в неядерную функцию, а затем ядро устройства вызывает эту функцию. Но он будет сообщать об ошибках: 【Ядро SYCL не может вызвать неопределенную функцию без атрибута SYCL_EXTERNAL】【Ядро SYCL не может вызвать функцию с переменным числом аргументов】
Я проверил стандарт SYCL2020: 【Код устройства SYCL, как определено в этой спецификации, не поддерживает вызовы виртуальных функций, указатели функций в целом, исключения, информацию о типах времени выполнения или полный набор библиотек C++, которые могут зависеть от этих функций или функций. конкретного хост-компилятора. Тем не менее, эти базовые ограничения могут быть сняты с помощью некоторых конкретных расширений Khronos или поставщиков.】Из вышеизложенного я могу сделать вывод, что DFT библиотеки Intel oneMKL должна быть вызываемой в ядре. (возможно?)
Ожидайте, что вы сможете вызвать это DFT в ядре (Intel GPU).
Ниже приведен DFT, реализующий oneMKL в ЦП:
#include <iostream>
#include <mkl_dfti.h>
#include <complex>
#include <vector>
using namespace std;
int main() {
complex<double> input[48] = { 0.5,-0.991445,0.258819,0.793353,-0.866025,-0.130526,0.965926,-0.608761,-0.5,0.991445,-0.258819,-0.793353,0.8 66025,0.130526,-0.965926,0.608761, 0.5,-0.991445,0.258819,0.793353,-0.866025,-0.130526,0.965926,-0.608761,-0.5,0.991445,-0.258819,-0.793353,0.866025,0.13052 6,-0.965926,0.608761,0.5,-0.991445,0.258819,0.793353,- 0.866025,-0.130526,0.965926,-0.608761,-0.5,0.991445,-0.258819,-0.793353,0.866025,0.130526,-0.965926,0.608761 };
complex<double> output[48]; // Output for complex-to-complex DFT;
DFTI_DESCRIPTOR_HANDLE my_desc_handle = NULL; // Descriptor handle for complex to complex FFT;
MKL_LONG status; // Variable to store command execution status;
status = DftiCreateDescriptor(&my_desc_handle, DFTI_DOUBLE, DFTI_COMPLEX, 1, 48); // Create a descriptor;
status = DftiSetValue(my_desc_handle, DFTI_PLACEMENT, DFTI_NOT_INPLACE); // Set non-in-place operations;
status = DftiSetValue(my_desc_handle, DFTI_NUMBER_OF_TRANSFORMS, 1); //Set the number of transformations to 1;
status = DftiCommitDescriptor(my_desc_handle); // Submit the descriptor to make its configuration effective;
status = DftiComputeForward(my_desc_handle, input, output); // Execute forward FFT;
status = DftiFreeDescriptor(&my_desc_handle); // Release descriptor;
cout << "FFT result:" << endl; //Output the FFT result from complex number to complex number
for (int i = 0; i < 48; i++) {
cout << output[i] << "\n";
}
cout << endl << endl;
return 0;
}





Intel oneMKL соответствует спецификации oneAPI UXL Foundation, как подробно описано здесь.
Я не тестировал следующий код, но ожидаю, что он будет примерно правильным:
oneapi::mkl::dft::descriptor<oneapi::mkl::dft::precision::DOUBLE,
oneapi::mkl::dft::domain::COMPLEX>
desc(static_cast<std::int64_t>(48));
desc.set_value(oneapi::mkl::dft::config_param::PLACEMENT,
oneapi::mkl::dft::config_value::NOT_INPLACE);
desc.set_value(oneapi::mkl::dft::config_param::NUMBER_OF_TRANSFORMS,
static_cast<std::int64_t>(1));
desc.commit(my_sycl_queue);
auto compute_event = oneapi::mkl::dft::compute_forward(desc, input, output);
// ... wait for the event to complete
compute_event.wait_and_throw();
Для более полного примера (включая получение очереди, выделение памяти, а также API-интерфейсы буфера и USM) попробуйте просмотреть репозиторий проекта интерфейса oneMKL (тот же интерфейс, что и у Intel oneMKL, но вызывает Intel/Nvidia/AMD/ чистые библиотеки SYCL в соответствии с используемым устройством) или примеры, предоставленные с oneMKL в базовом наборе инструментов по адресу <ONEMKL_BASE>/mkl/latest/share/doc/mkl/examples/examples_sycl.tgz и (после распаковки) <examples_sycl>/sycl/dft/.
Большое спасибо! Ваш ответ мне очень помог, я нашел несколько полных примеров БПФ в локальном пути установки oneMKL
<path>\mkl\2024.0\share\doc\mkl\examples.