如果不使用共享内存数组(L1),我的CUDA内核运行速度会快得多,我可以使用线程寄存器内存。
我可以使用以下声明在CUDA-C中执行此操作:
unsigned short window[15];
但在C#中我尝试:
ushort[] window = new ushort[15];
我遇到一个关于无法在CudaFy中创建数组的运行时错误。我不想要全局内存数组或共享内存。 (这是大多数讨论问题)。我正在运行SM35架构。
Array create expressions are not supported.
答案 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要做进一步的测试:)