Инструменты: preprocess_cl и convert_cl_structs

Ниже описаны два вспомогательных CLI-инструмента, которые упрощают работу с OpenCL-кодом и его интеграцию в C#:

Оба инструмента предназначены для использования на этапе подготовки исходников к сборке и помогают добиться стабильной компиляции/совместимости на разных драйверах.

preprocess_cl

Инструмент выполняет предварительную обработку .cl файлов:

Частые сценарии

Сборка ядра из нескольких файлов:

preprocess_cl -I kernels/include -I shared -D USE_FAST_MATH=1 -o build/add.pre.cl kernels/add.cl

Тестирование разных конфигураций:

# Включаем поддержку double
preprocess_cl -D ENABLE_DOUBLE=1 -o build/compute.pre.cl kernels/compute.cl

# Сборка под CL2.0 (можно вместе с ProgramBuildOptions.SetStandard("CL2.0"))
preprocess_cl -D CL_STD=200 -I kernels -o build/main.pre.cl kernels/main.cl

Ключевые параметры (типичные)

Рекомендации

convert_cl_structs

Инструмент анализирует объявления структур/типов в OpenCL C и генерирует эквивалентные C#-структуры с корректной раскладкой памяти:

Конфигурация (YAML/JSON)

Инструмент поддерживает YAML/JSON конфиг и CLI-переопределения.

Пример cl_structs.yml:

input: kernels/types.cl
output:
	folder: IgdrasilCompute/Generated
	single_file: true
	file_name: ClTypes.cs
namespace: IgdrasilEngine.Engine.Runtime.GPU
pack: 4
unsafe_vectors: false
mappings:
	size_t: ulong
	bool: int
	float4:
		cs: FVector4
		import: IgdrasilEngine.Engine.Math.Vectors

Ключи:

Запуск

С конфигом:

python IgdrasilCompute/Tools/convert_cl_structs.py --config cl_structs.yml

Переопределения через CLI:

python IgdrasilCompute/Tools/convert_cl_structs.py --config cl_structs.yml --pack 8 --unsafe-vectors

Без конфигурации (легаси-режим, совместимость):

python IgdrasilCompute/Tools/convert_cl_structs.py kernels/types.cl IgdrasilCompute/Generated IgdrasilEngine.Engine.Runtime.GPU

Вывод

Парсер OpenCL структур

Поддерживаются объявления:

Поля: массивы и векторы

Соответствия типов (дефолтные правила)

Соответствия типов (правила)

Рекомендации

Интеграция с IgdrasilCompute

Типовой пайплайн

preprocess_cl → ProgramBuildOptions → Program.FromFile → CreateKernel → SetArgs → Run → Wait → Read

Пример связки

# 1) Препроцессинг
preprocess_cl -I kernels/include -D USE_FAST_MATH=1 -o build/main.pre.cl kernels/main.cl

# 2) Конвертация структур
convert_cl_structs --input kernels/types.cl --namespace IgdrasilEngine.Engine.Runtime.GPU --output IgdrasilCompute/Generated/ClTypes.cs

В C#:

// Загрузка «плоского» файла
using var program = Program.FromFile("build/main.pre.cl", new ProgramBuildOptions().EnableFastMath(true));
var kernel = program.CreateKernel("process");

// Использование сгенерированных типов
var param = new ClMyParams { iterations = 1024, scale = 3.14f };
kernel.SetArgument(0u, param);

Лучшие практики