2015-03-09 4 views
0

Мое ядро ​​CUDA будет работать намного быстрее, если вместо массива разделяемой памяти (L1) я смог использовать память регистров потоков.Создание массивов переменных регистров с помощью CudaFy

я могу сделать это в CUDA-C со следующей декларацией:

unsigned short window[15]; 

, но в C#, когда я пытаюсь:

ushort[] window = new ushort[15]; 

я получаю сообщение об ошибке во время выполнения программы о не в состоянии создавать массивы в CudaFy. Мне не нужен массив глобальной памяти или разделяемая память. (которые являются наиболее обсуждаемыми вопросами). Я работаю с архитектурой SM35.

Array create expressions are not supported. 

ответ

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); 

Я m не совсем уверен, если вам даже нужно позвонить CudafyTranslator.Cudafy(), чтобы получить модуль, но это работает для меня, и я только запускаю этот код один раз, поэтому cba для дальнейшего тестирования :)

+2

Не проще ли было бы использовать атрибут [CudafyDummy], а затем написать это прямо CUDA-C? (P.S. Я думаю, что Ник Копп заинтересован в добавлении этого в CudaFy), но больше голосов поможет. –

+0

Я даже не знал о опции [CudafyDummy]. Это кажется несколько проще - по крайней мере, проще в управлении! Благодаря! – Amavin