2016-11-23 3 views
1

Вот я пришел с какими-то проблемами, используя managedCUDA,ManagedCUDA: Object Содержать без primitve/не blitable

я получил приложение, написанное на CUDA C/C++, и я хотел, чтобы запустить его с помощью managedCUDA.

Чтобы начать с моей проблемой: я получил эту ошибку:

Ungandled Исключения: System.ArgumentException: Объект содержит непримитивный или не blittable данные.

Это произошло на трассе, где я сделал variable.CopyToDevice(otherVariable)

я искать что non-primitive и что non-blittable

Для non-primitive я получил:

непримитивными типов (или) Определено пользователем

Ex: класс, структура, перечисление, интерфейс, делегат, массив.

non-blittable Для меня:

В следующей таблице перечислены * без blittable типы из системы имен. > Делегаты, которые представляют собой структуры данных, которые ссылаются на статический метод или на экземпляр класса>, также не могут быть гибкими.

* таблицей: System.Array, System.Boolean, System.Char, System.Class,> System.Object, System.Mdarray, System.String, Systeme.Valuetype, Systeme.Szarray

Так вот пример моего кода:

using ManagedCuda; 
using ManagedCuda.BasicTypes; 
using System; 
using System.Linq; 
using System.Runtime.InteropServices; 
using System.Diagnostics; 
using System.Text.RegularExpressions; 

namespace Code 
{ 
    class Program 
    { 
     [StructLayout(LayoutKind.Sequential)] 
     struct Cartesian 
     { 
      // all in is public 

      /* some double and Global variables */ 

      /* some function (Cartesian, void, double, LatLonAlt type) */ 
     } 

     [StructLayout(LayoutKind.Sequential)] 
     struct LatLonAlt 
     { 
      // all in is public 

      /* some double, Cartesian and Global variables */ 

      /* some function (LatLonAlt, void, Cartesian type) */ 
     } 

     [StructLayout(LayoutKind.Sequential)] 
     struct Global 
     { 
      /* some function (double, Cartesian, int, void type) */ 
     } 

     [StructLayout(LayoutKind.Sequential)] 
     struct Propagator 
     { 
      // all in is public 

      /* some double, int and Global variables */ 

      /* some function (void, Cartesian, double type) */ 
     } 

     [StructLayout(LayoutKind.Sequential)] 
     struct EarthCoordinates 
     { 
      // all in is publis 

      /* some Cartesian, double, LatLonAlt, bool and Global variables */ 

      /* one EarthCoordinates "constructor" and one Cartesian function */ 
     } 

     static void Main(string[] args) 
     { 
      Propagator[] host_prop = new Propagator[180]; 
      initPropagator(ref host_prop); 
      CudaDeviceVariable<Propagator> dev_prop = new CudaDeviceVariable<Propagator>(180); 
      dev_prop.CopyToDevice(host_prop); 

      EarthCoordinates[] earthStation = new EarthCoordinates[1]; 
      initEarthCoordinates(ref earthStation); 
      CudaDeviceVariable<EarthCoordinates> dev_station = new CudaDeviceVariable<EarthCoordinates>(1); 
      dev_station.CopyToDevice(earthStation); 
     } 
    } 
} 

ошибка не появляется на линии: dev_prop.CopyToDevice(host_prop);

кажется, что Global не является проблемой, ни тот факт, что Распространитель является структурой

Но на линии: dev_station.CopyToDevice(earthStation);

Как вы можете видеть, что я сделал «же» вещь для обеих переменных так, что это не так, как я продолжу, что вызывает ошибку. Я предполагаю, что это происходит из EarthCoordinates struct, которые содержат другой объект struct, и может быть, это и есть проблема.

Итак, зная, что я использую managedCUDA, и я не могу сделать это так же, как в CUDA C/C++, я не знаю, как решить эту ошибку. Так есть ли способ сделать эту работу?

Спасибо всем!

ответ

0

Итак, после некоторого рытья я понял, что проблема просто исходит из логического значения ... Поэтому я изменил его на int (0/false - 1/true), и копия снова работает!

Смежные вопросы