使用CudaFy创建寄存器变量数组

时间:2015-03-09 17:51:24

标签: cudafy.net

如果不使用共享内存数组(L1),我的CUDA内核运行速度会快得多,我可以使用线程寄存器内存。

我可以使用以下声明在CUDA-C中执行此操作:

unsigned short window[15];

但在C#中我尝试:

ushort[] window = new ushort[15];

我遇到一个关于无法在CudaFy中创建数组的运行时错误。我不想要全局内存数组或共享内存。 (这是大多数讨论问题)。我正在运行SM35架构。

Array create expressions are not supported.

1 个答案:

答案 0 :(得分:2)

似乎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要做进一步的测试:)