создание массивов в Nvidia cuda ядро

привет я просто хотел знать, возможно ли сделать следующую внутреннюю часть Nvidia cuda ядро

__global__ void compute(long *c1, long size, ...)
{
  ...
  long d[1000];
  ...
}

или следующее

__global__ void compute(long *c1, long size, ...)
{
  ...
  long d[size];
  ...
}
10
задан halfelf 19 December 2018 в 02:00
поделиться

3 ответа

Вы можете выполнить первый пример, я не пробовал второй.

Однако, если вы можете помочь, вы можете изменить свою программу, чтобы этого не происходило. Вы не хотите выделять в ядре 4000 байт памяти. Это приведет к частому использованию локальной памяти CUDA, поскольку вы не сможете уместить все в регистры. Локальная память CUDA работает медленно (задержка памяти 400 циклов).

10
ответ дан 3 December 2019 в 15:06
поделиться

Вы можете сделать #1, но учтите, что это будет сделано в КАЖДОМ потоке!

Ваш второй фрагмент не будет работать, потому что динамическое распределение памяти во время выполнения ядра не поддерживается.

9
ответ дан 3 December 2019 в 15:06
поделиться

Проект apache hama имеет некоторую интересную реализацию алгоритма собственных значений Якоби. Он работает на Хэдупе. Обратите внимание, что поворот происходит при сканировании матрицы, а не при уменьшении карты.

-121--3114433-

Да, к сожалению, LINQ не поддерживает предоставление пользователю выбора участника для получения отдельных записей. Так что я рекомендую создать для него свой метод расширения:

/// <summary>
    /// Returns a list with the ability to specify key(s) to compare uniqueness on
    /// </summary>
    /// <typeparam name="T">Source type</typeparam>
    /// <param name="source">Source</param>
    /// <param name="keyPredicate">Predicate with key(s) to perform comparison on</param>
    /// <returns></returns>
    public static IEnumerable<T> Distinct<T>(this IEnumerable<T> source,
                                             Func<T, object> keyPredicate)
    {
        return source.Distinct(new GenericComparer<T>(keyPredicate));
    }

А затем создать дженерик-компаратор, который вы заметите достаточно дженерик.

   public class GenericComparer<T> : IEqualityComparer<T>
    {
        private Func<T, object> _uniqueCheckerMethod;

        public GenericComparer(Func<T, object> keyPredicate)
        {
            _uniqueCheckerMethod = keyPredicate;
        }

        #region IEqualityComparer<T> Members

        bool IEqualityComparer<T>.Equals(T x, T y)
        {
            return _uniqueCheckerMethod(x).Equals(_uniqueCheckerMethod(y));
        }

        int IEqualityComparer<T>.GetHashCode(T obj)
        {
            return _uniqueCheckerMethod(obj).GetHashCode();
        }

        #endregion
    }

Теперь просто свяжите свою выписку LINQ: var records = кэш. Выберите (rec = > rec.Id) .Distinct () .Take (n);

var results = cache.Distinct(rec => rec.Id).Take(n));

hth

-121--4435075-

При запуске ядра можно динамически выделять общую память.

__global__ void compute(long *c1, long size, ...)
 {
  ...
   extern __shared__ float shared[];
  ...
 }

compute <<< dimGrid, dimBlock, sharedMemSize >>>( blah blah );

Руководство по программированию CUDA:

размер массива определяется во время запуска (см. раздел 4.2.3).

6
ответ дан 3 December 2019 в 15:06
поделиться
Другие вопросы по тегам:

Похожие вопросы: