使用 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 会做进一步的测试 :)