使用 CudaFy 创建寄存器变量数组
Creating register variable arrays with CudaFy
如果我能够使用线程寄存器内存而不是共享内存数组 (L1),我的 CUDA 内核会 运行 快得多。
我可以使用以下声明在 CUDA-C 中执行此操作:
unsigned short window[15];
但在 C# 中,当我尝试时:
ushort[] window = new ushort[15];
我收到 运行 次错误,提示无法在 CudaFy 中创建数组。我不想要全局内存阵列或共享内存。 (这是大多数讨论的问题)。我是运行SM35架构
Array create expressions are not supported.
似乎 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 会做进一步的测试 :)
如果我能够使用线程寄存器内存而不是共享内存数组 (L1),我的 CUDA 内核会 运行 快得多。
我可以使用以下声明在 CUDA-C 中执行此操作:
unsigned short window[15];
但在 C# 中,当我尝试时:
ushort[] window = new ushort[15];
我收到 运行 次错误,提示无法在 CudaFy 中创建数组。我不想要全局内存阵列或共享内存。 (这是大多数讨论的问题)。我是运行SM35架构
Array create expressions are not supported.
似乎 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 会做进一步的测试 :)