привет я просто хотел знать, возможно ли сделать следующую внутреннюю часть Nvidia cuda ядро
__global__ void compute(long *c1, long size, ...)
{
...
long d[1000];
...
}
или следующее
__global__ void compute(long *c1, long size, ...)
{
...
long d[size];
...
}
Вы можете выполнить первый пример, я не пробовал второй.
Однако, если вы можете помочь, вы можете изменить свою программу, чтобы этого не происходило. Вы не хотите выделять в ядре 4000 байт памяти. Это приведет к частому использованию локальной памяти CUDA, поскольку вы не сможете уместить все в регистры. Локальная память CUDA работает медленно (задержка памяти 400 циклов).
Вы можете сделать #1, но учтите, что это будет сделано в КАЖДОМ потоке!
Ваш второй фрагмент не будет работать, потому что динамическое распределение памяти во время выполнения ядра не поддерживается.
Проект 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).