Я написал простой файл cuda, который успешно создает в visual studio 2010 & nsight eclipse
код здесь
#include <stdlib.h>
#include <stdio.h>
#include <string.h>
#include <math.h>
#include <cufft.h>
#include <cutil_inline.h>
typedef float2 Complex;
int main(int argc, char** argv)
{
const int NX = 1024;
const int BATCH = 90000;
const int SIGNAL_SIZE = NX * BATCH;
Complex* h_signal = (Complex*)malloc(sizeof(Complex) * SIGNAL_SIZE);
for (unsigned int i = 0; i < SIGNAL_SIZE; ++i) {
h_signal[i].x = rand() / (float)RAND_MAX;
h_signal[i].y = 0;
}
Complex* d_signal;
cutilSafeCall(cudaMalloc((void**)&d_signal, sizeof(Complex)*SIGNAL_SIZE));
cutilSafeCall(cudaMemcpy(d_signal, h_signal, sizeof(Complex)*SIGNAL_SIZE,
cudaMemcpyHostToDevice));
cufftHandle plan;
cufftSafeCall(cufftPlan1d(&plan, NX, CUFFT_C2C, BATCH));
cufftSafeCall(cufftExecC2C(plan, (cufftComplex *)d_signal, (cufftComplex *)d_signal, CUFFT_FORWARD));
cutilSafeCall(cudaMemcpy(h_signal, d_signal, SIGNAL_SIZE*sizeof(Complex),
cudaMemcpyDeviceToHost));
//Destroy CUFFT context
cufftSafeCall(cufftDestroy(plan));
// cleanup memory
free(h_signal);
cutilSafeCall(cudaFree(d_signal));
cudaThreadExit();
cutilExit(argc, argv);
}
Я изменил NX & BATCH четыре раза, например, с помощью
const int NX = 1024;
const int BATCH = 90000;
const int SIGNAL_SIZE = NX * BATCH;
cufftHandle plan;
cufftPlan1d(&plan, NX, CUFFT_C2C, BATCH);
Я успешно запускаю Sample в visual studio 2010 и 2012 (Windows 7 64 бит), но в ubuntu 12.04 (32 бит) nsight eclipse дает эту ошибку
CUFFT_ALLOC_FAILED
для функции cufftPlan1d
Я меняю BATCH на 80000 (NX = 1024), и эта ошибка произошла в ubuntu, но в Visual Studio 2010 я запускаю без ошибок!
Я использую Cuda toolkit 5.5, который имеет эту функцию:
Преобразование размеров до 128 миллионов элементов в одной точности
и 80000 * 1024 = 81920000 элементов <128 миллионов элементов
Я меняю BATCH на 8000 (NX = 1024) и эта ошибка не возникает в ubuntu
Пожалуйста помогите
благодаря
Вы можете оценить объем памяти, необходимый для вашего вызова cufftEstimate1d
используя cufftEstimate1d
.
#include <conio.h>
#include <cufft.h>
#define cufftSafeCall(err) __cufftSafeCall(err, __FILE__, __LINE__)
inline void __cufftSafeCall(cufftResult err, const char *file, const int line)
{
if( CUFFT_SUCCESS != err) {
fprintf(stderr, "cufftSafeCall() CUFFT error in file <%s>, line %i.\n",
file, line);
getch(); exit(-1);
}
}
int main() {
const int NX = 1024;
const int BATCH = 100000;
size_t workSize;
cufftSafeCall(cufftEstimate1d(NX, CUFFT_C2C, BATCH, &workSize));
printf("%i\n",workSize);
getchar();
}
Документация CUFFT: http://docs.nvidia.com/cuda/cufft/#function-cufftplan1d
CUFFT_ALLOC_FAILED: The allocation of GPU resources for the plan failed.
Значение cufftPlan1d()
не удалось выделить память на GPU, вероятно, из-за нехватки свободной памяти. Доступный VRAM не изменился бы между операционными системами, так что либо у вас нет правильных драйверов для вашей карты, либо вы используете Ubuntu на отдельной машине с графическим процессором с ограниченным VRAM. Вы можете проверить доступную глобальную память cudaGetDeviceProperties()
cudaThreadExit()
устарела в пользуcudaDeviceReset()
, см. Этот документ