好像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);
我不完全确定您是否需要调用 CudafyTranslator.Cudafy() 来获取模块,但这对我有用,我只运行此代码一次,因此 cba 进行进一步测试:)