CUFFT никак не связан с .NET, но в C# Вы можете импортировать всё что
угодно с помощью dllimport, по кр. мере в 2.0 так было.
Batch - это количество рядов. Нарпример, если Вам нужно сделать прямое
преобразование над несколькими одномерными рядами одинаковой длины. В
этом случае, их можно либо преобразовывать по отдельности, либо можно
расположить их один за другим и обработать за один вызов cufft, указав
batch=<количество рядов>. Второй способ может дать бОльшую
производительность. Вообще cufft немного похож на fftw. В терминах
fftw batch - это many.
- Д.
13 августа 2011 г. 23:30 пользователь Алексей Вахтин
<alva...@gmail.com> написал:
> Кто-нибудь использовал библиотеку CUFFT? Где можно найти примеры?
> Интересуют как классический CUDA C, так и .Net. Мне не понятно, зачем
> нужен параметр batch? nx, как я понимаю, число элементов в массиве.
>
> --
> Вы получили это сообщение, поскольку подписаны на группу CUDA.CS.MSU.SU.
>
> Чтобы добавлять сообщения в эту группу, отправьте письмо по адресу cudac...@googlegroups.com.
> Чтобы отменить подписку на эту группу, отправьте сообщение по адресу cudacsmsusu...@googlegroups.com.
> О дополнительных функциях можно узнать в группе по адресу http://groups.google.com/group/cudacsmsusu?hl=ru.
>
>
CUFFT никак не связан с .NET, но в C# Вы можете импортировать всё что
угодно с помощью dllimport, по кр. мере в 2.0 так было.
Batch - это количество рядов. Нарпример, если Вам нужно сделать прямое
преобразование над несколькими одномерными рядами одинаковой длины. В
этом случае, их можно либо преобразовывать по отдельности, либо можно
расположить их один за другим и обработать за один вызов cufft, указав
batch=<количество рядов>. Второй способ может дать бОльшую
производительность. Вообще cufft немного похож на fftw. В терминах
fftw batch - это many.
Кто-нибудь использовал библиотеку CUFFT? Где можно найти примеры?
Вот мой код:
void cufwtExec(double* &data, int N)
{
cufftHandle plan;
cufftDoubleComplex *out_data;
cufftDoubleReal *in_data;
cutilSafeCall(cudaMalloc((void**)&in_data, sizeof(double) * N));
cutilSafeCall(cudaMemcpy(in_data, data, sizeof(double) * N,
cudaMemcpyHostToDevice));
cutilSafeCall(cudaMalloc((void**)&out_data, sizeof(cufftComplex) *
N));
cufwtCheckError(cufftPlan1d(&plan, N, CUFFT_D2Z, 1));
cufwtCheckError(cufftExecD2Z(plan, in_data, out_data));
cufftDoubleComplex *res = new cufftDoubleComplex[N];
cutilSafeCall(cudaMemcpy(res, out_data, sizeof(cufftComplex) * N,
cudaMemcpyDeviceToHost));
for (int I = 0; I < N; I++)
{
data[I] = res[I].x;
};
delete[] res;
cufwtCheckError(cufftDestroy(plan));
cutilSafeCall(cudaFree(in_data));
cutilSafeCall(cudaFree(out_data));
}
Задаю дельтафункцию: 192 элемента нулевые, на 50-м месте - единица. В
результате получаю первые 96 элементов немного похожи на реальную
часть фурье, но, мне кажется, не совсем точное, а остальные 96
элементов - вообще не затронуты, просто мусор. Почему? Что-то не так с
параметрами? Я уже и с коэффициентами в cufftPlan1d пытался поработать
- все равно, считает на половину почему-то.
For real‐to‐complex FFTs, the output array holds only the nonredundant
complex coefficients. So for an N‐element transform, the output array
holds N/2+1 cufftComplex terms.
16 августа 2011 г. 15:13 пользователь Алексей Вахтин
<alva...@gmail.com> написал:
Может cufftDoubleComplex и cufftComplex размером отличаются?
Тогда ошибка здесь:cutilSafeCall(cudaMemcpy(res, out_data, sizeof(cufftComplex) * N,
cudaMemcpyDeviceToHost));Должно бытьcutilSafeCall(cudaMemcpy(res, out_data, sizeof(cufftDoubleComplex) * N,
cudaMemcpyDeviceToHost));
16 августа 2011 г. 15:24 пользователь Сергей Козлов <kozlov.sergey....@gmail.com> написал:
Может cufftDoubleComplex и cufftComplex размером отличаются?
Да, они размером отличаются, так как cufftComplex - основан на float, а cufftDoubleComplex - на double. Но я посмотрел код, вроде везде используется double и cufftDoubleComplex. Константа в функцию cufftPlan1d передается CUFFT_D2Z - double в DoubleComplex, используется функция cufftExecD2Z. Врде так все. или где-то есть подвох?
--