Похож Cudafy в настоящее время не поддерживает создание потоков локальных массивов, поэтому делаю это через Cudafy в настоящее время не представляется возможным.
Вы можете сделать это вручную, как и заставить Cudafy использовать вручную отредактированную версию сгенерированного кода Cuda C:
CudaGPU gpu = (CudaGPU)CudafyHost.GetDevice(eGPUType.Cuda, 0);
CompileProperties prop = new CompileProperties()
{
Platform = ePlatform.x64,
Architecture = eArchitecture.sm_50,
CompileMode = eCudafyCompileMode.Default,
CompilerPath = @"C:\Program Files\NVIDIA GPU Computing Toolkit\CUDA\v6.5\bin\nvcc",
WorkingDirectory = @"C:\Path\To\Project\bin\Debug",
TimeOut = 60000,
IncludeDirectoryPath = @"C:\Program Files\NVIDIA GPU Computing Toolkit\CUDA\v6.5\include",
};
CudafyModule module = CudafyTranslator.Cudafy(prop, typeof(YourClass));
Чтобы убедиться, что он будет использовать измененный файл кода вместо файла кода сгенерированного по вызову CudafyTranslator.Cudafy()
, архитектура должна быть установлена выше предыдущей.
prop.Architecture = eArchitecture.sm_52;
prop.InputFile = @"ModifiedCudaSource.cu";
файл, указанный в InputFile
должен быть в WorkingDirectory
Наконец, добавьте измененный исходный файл модуля, скомпилировать новый PTX и загрузить модуль:
module.AddSourceCodeFile(new SourceCodeFile(File.ReadAllText(Path.Combine(prop.WorkingDirectory, prop.InputFile), Encoding.Default), eLanguage.Cuda, prop.Architecture));
module.Compile(prop);
gpu.LoadModule(module);
Я m не совсем уверен, если вам даже нужно позвонить CudafyTranslator.Cudafy()
, чтобы получить модуль, но это работает для меня, и я только запускаю этот код один раз, поэтому cba для дальнейшего тестирования :)
Не проще ли было бы использовать атрибут [CudafyDummy], а затем написать это прямо CUDA-C? (P.S. Я думаю, что Ник Копп заинтересован в добавлении этого в CudaFy), но больше голосов поможет. –
Я даже не знал о опции [CudafyDummy]. Это кажется несколько проще - по крайней мере, проще в управлении! Благодаря! – Amavin