Я столкнулся с проблемой при использовании Alea GPU для моего приложения на C #.Это исключение, когда он пытается использовать мой графический процессор.Ниже мой код и след стека проблемы.Когда я запускаю код, он хорошо работает в первый раз.Тем не менее, когда запустить то же самое во второй раз, он показывает исключение.Может ли кто-нибудь помочь мне выяснить, что это за проблема и как ее исправить.Спасибо!
Мой код:
public void Execute(double[] series, double[] query, int range)
{
var gpu = Gpu.Default;
var blockDim = GPU_BLOCK_SIZE;
int threadSize = series.Length - query.Length + 1;
var gridDim = (int)(threadSize + blockDim - 1) / blockDim;
var launchParam = new LaunchParam(gridDim, blockDim, query.Length * sizeof(double));
var dSeries = gpu.Allocate(series);
var dQuery = gpu.Allocate(query);
var dDistances = gpu.Allocate<double>(threadSize);
var dFlatMatrix = gpu.Allocate<double>(threadSize * (query.Length + 1) * 2);
//Calculate metric DTW
gpu.Launch(Calculate, launchParam, dSeries, dQuery, range, dDistances, dFlatMatrix);
double[] distances = Gpu.CopyToHost(dDistances);
Gpu.Free(dDistances);
Gpu.Free(dFlatMatrix);
Gpu.Free(dQuery);
Gpu.Free(dSeries);
for (int i = 0; i < distances.Length; i++)
{
//Do something here on CPU
}
}
private static void Calculate(double[] series, double[] query, int range, double[] distance, double[] flatMatrix)
{
var idx = blockIdx.x * blockDim.x + threadIdx.x;
var windowSize = query.Length + 1;
var sharedQuery = __shared__.ExternArray<double>();
for (int i = 0; i < windowSize - 1; i++)
{
sharedQuery[i] = query[i];
}
DeviceFunction.SyncThreads()
if (idx < series.Length - query.Length + 1)
{
int k, l, g
k = 0; l = 1;
SetFlatMatrixValue(flatMatrix, idx, windowSize, k, 0, 0);
for (int m = 1; m < windowSize; m++)
{
SetFlatMatrixValue(flatMatrix, idx, windowSize, k, m, Double.PositiveInfinity);
k = 1; l = 0;
for (int j = 1; j < windowSize; j++)
for (int m = 0; m < windowSize; m++)
{
SetFlatMatrixValue(flatMatrix, idx, windowSize, k, m, Double.PositiveInfinity);
var lower = DeviceFunction.Max(j - range, 1);
var upper = DeviceFunction.Min(j + range + 1, windowSize)
for (int i = lower; i < upper; i++)
{
double prevDist1 = GetFlatMatrixValue(flatMatrix, idx, windowSize, l, i - 1);
double prevDist2 = GetFlatMatrixValue(flatMatrix, idx, windowSize, l, i);
double prevDist3 = GetFlatMatrixValue(flatMatrix, idx, windowSize, k, i - 1);
double dist = (series[idx + j - 1] - sharedQuery[i - 1]) * (series[idx + j - 1] - sharedQuery[i - 1]);
double prevDist = DeviceFunction.Min(DeviceFunction.Min(prevDist1, prevDist2), prevDist3)
SetFlatMatrixValue(flatMatrix, idx, windowSize, k, i, dist + prevDist);
g = k; k = l; l = g;
distance[idx] = DeviceFunction.Sqrt(GetFlatMatrixValue(flatMatrix, idx, windowSize, l, windowSize - 1));
}
private static void SetFlatMatrixValue(double[] array, int arrayIdx, int width, int row, int col, double value)
{
array[(2 * arrayIdx + row) * width + col] = value;
private static double GetFlatMatrixValue(double[] array, int arrayIdx, int width, int row, int col)
{
return array[(2 * arrayIdx + row) * width + col];
}
StackTrace:
System.Exception на Alea.CUDAInterop.cuSafeCall@ 2939.Invoke (строковое сообщение)
в Alea.CUDAInterop.cuSafeCall (результат cudaError_enum)
в A.cf5aded17df9f7cc4c132234dda010fa7.Copy@918-22.Invoke (Unit _ar *)1017 * в Alea.Memory.Copy (FSharpOption 1 streamOpt, Memory src, IntPtr srcOffset, Memory dst, IntPtr dstOffset, FSharpOption
1 lengthOpt)
в Alea.Gpu.RawCopy (FSharpOption 1 streamOpt, Memory src, IntPtr srcOffset, Array dst, IntPtr dstOffset, FSharpOption
1 lengthOpt)
в Alea.Gpu.CopyToHost [T] (T [] src)
в TimeSeriesSubsequenceJoin.BFParallel.Execute () в D: \ Workspaces \ Visual Studio \ TimeSeriesSubseptionsJoin \ TimeSeriesSubsequenceJoin \ SourceCode \ Algorithms \ BFParallel.cs: строка 113