Я пытаюсь сделать расчет FFT плюс ядра. FFT: библиотека managedCUDA ядро известково: собственное ядро 1D FFT плюс вычисление ядра с помощью управляемого CUDA
C# код
public void cuFFTreconstruct() {
CudaContext ctx = new CudaContext(0);
CudaKernel cuKernel = ctx.LoadKernel("kernel_Array.ptx", "cu_ArrayInversion");
float[] fData = new float[Resolution * Resolution * 2];
float[] result = new float[Resolution * Resolution * 2];
CudaDeviceVariable<float> devData = new CudaDeviceVariable<float>(Resolution * Resolution * 2);
CudaDeviceVariable<float> copy_devData = new CudaDeviceVariable<float>(Resolution * Resolution * 2);
int i, j;
Random rnd = new Random();
double avrg = 0.0;
for (i = 0; i < Resolution; i++)
{
for (j = 0; j < Resolution; j++)
{
fData[(i * Resolution + j) * 2] = i + j * 2;
fData[(i * Resolution + j) * 2 + 1] = 0.0f;
}
}
devData.CopyToDevice(fData);
CudaFFTPlan1D plan1D = new CudaFFTPlan1D(Resolution * 2, cufftType.C2C, Resolution * 2);
plan1D.Exec(devData.DevicePointer, TransformDirection.Forward);
cuKernel.GridDimensions = new ManagedCuda.VectorTypes.dim3(Resolution/256, Resolution, 1);
cuKernel.BlockDimensions = new ManagedCuda.VectorTypes.dim3(256, 1, 1);
cuKernel.Run(devData.DevicePointer, copy_devData.DevicePointer, Resolution);
devData.CopyToHost(result);
for (i = 0; i < Resolution; i++)
{
for (j = 0; j < Resolution; j++)
{
ResultData[i, j, 0] = result[(i * Resolution + j) * 2];
ResultData[i, j, 1] = result[(i * Resolution + j) * 2 + 1];
}
}
ctx.FreeMemory(devData.DevicePointer);
ctx.FreeMemory(copy_devData.DevicePointer);
}
код ядра
//Includes for IntelliSense
#define _SIZE_T_DEFINED
#ifndef __CUDACC__
#define __CUDACC__
#endif
#ifndef __cplusplus
#define __cplusplus
#endif
#include <cuda.h>
#include <device_launch_parameters.h>
#include <texture_fetch_functions.h>
#include "float.h"
#include <builtin_types.h>
#include <vector_functions.h>
// Texture reference
texture<float2, 2> texref;
extern "C"
{
__global__ void cu_ArrayInversion(float* data_A, float* data_B, int Resolution)
{
int image_x = blockIdx.x * blockDim.x + threadIdx.x;
int image_y = blockIdx.y;
data_B[(Resolution * image_x + image_y) * 2] = data_A[(Resolution * image_y + image_x) * 2];
data_B[(Resolution * image_x + image_y) * 2 + 1] = data_A[(Resolution * image_y + image_x) * 2 + 1];
}
}
Однако эта программа не работает. Произошла ошибка:
ОшибкаLaunchFailed: Исключение произошло на устройстве во время выполнения ядра. Распространенные причины включают разыменование недопустимого указателя устройства и доступ к нераспределенной общей памяти. Контекст нельзя использовать, поэтому он должен быть уничтожен (и должен быть создан новый). Все существующие распределения памяти устройства из этого контекста являются недопустимыми и должны быть восстановлены, если программа продолжит использовать CUDA.
Пожалуйста, пост также обновленный код хоста или дважды проверьте, что оно соответствует приведенному выше коду. Если я позволю обеим вашим ядрам работать с кодом хоста, который я разместил здесь, все работает нормально. Cuda Memory Checker не находит ничего и не сообщает об ошибке. – kunzmi
Благодарим вас за комментарии. Я проверил свой код. Однако я не мог найти ошибку. Моя программа была сделана ссылкой на сайты: (setup: https://managedcuda.codeplex.com/documentatio, dll: https://github.com/kunzmi/managedCuda, пример кода: https://github.com/ kunzmi/managedCuda). Когда я делаю 2D cuda и 1D cuda с managedCUDA, программы работают хорошо, и я могу получить хороший результат FFT. – test
Пожалуйста, разместите свой код хоста точно так же, как вы его используете, чтобы можно было воспроизвести вашу проблему. Снова: код хоста, который я разместил выше, работает без проблем вместе с вашими ядрами, поэтому разница должна быть разной. – kunzmi