Вот я пришел с какими-то проблемами, используя 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++, я не знаю, как решить эту ошибку. Так есть ли способ сделать эту работу?
Спасибо всем!