2015-05-20 2 views
-2

Я пытался хранить не квадратные изображения в томе. Мой код работает, когда я хочу сохранить 512 раз, квадратное изображение размером w512 x h512, но оно не работает для неквадратного изображения размером w512 x h1024. Я получаю сообщение об ошибке unspecified launch failure на этой строке: gpuErrchk(cudaDeviceSynchronize()); Я не уверен, почему это происходит? Я попытался установить свой код так, чтобы он обращался к данным в объединенном режиме. Есть ли альтернативное решение моей проблемы?Хранение неквадратных изображений в томе

Это мое ядро:

__global__ void 
copySlice2Volume2(float *buffer, float *slice, int height, int width, int frameIdx) 
{ 

    int tid = (blockIdx.x * width) + threadIdx.x; 
    buffer[tid + (frameIdx*width*height)] = slice[tid]; 

    __syncthreads(); 

} 

Следующая функция, которая вызывает выше ядро:

void testStorage() { 

    int nFrames = 512; 

    int width = 0; 
    int height = 0; 

    // 8-bit unsigned char images 
    Mat frame, floatFrame; 

    frame = imread("C:/Matlab code/im.png", CV_LOAD_IMAGE_GRAYSCALE); 

    // convert uchar images to float images 
    frame.convertTo(floatFrame, CV_32F, 1.0/255.0f); 

    width = frame.step; 
    height = frame.rows; 

    cout << "width: " << width << " height: " << height << endl; 
    float *gpuBuffer; 
    float *testImage; 

    gpuErrchk(cudaMalloc((void**) &gpuBuffer, sizeof(float) * width * height * nFrames));   // storage init for buffer 
    gpuErrchk(cudaMemset(gpuBuffer, 0, sizeof(float) * width * height * nFrames)); // set mem to 0 

    gpuErrchk(cudaMalloc((void**) &testImage, sizeof(float) * width * height));   // storage init for image 
    gpuErrchk(cudaMemset(testImage, 0, sizeof(float) * width * height)); // set mem to 0 

    gpuErrchk(cudaMemcpy(testImage, floatFrame.ptr<float>(), sizeof (float) * width * height, cudaMemcpyHostToDevice)); 

    // num of threads 
    dim3 Threads(width); 
    // num of blocks 
    dim3 Blocks(height); 

    for(int i = 0; i < nFrames; i++) 
    { 
     copySlice2Volume2<<< Blocks, Threads >>> (gpuBuffer, testImage, width, height, i); 

    } 

    gpuErrchk(cudaDeviceSynchronize()); // error here 

    printf("Cuda status2: %s\n", cudaGetErrorString(cudaGetLastError())); 

    gpuErrchk(cudaFree(gpuBuffer)); 
    gpuErrchk(cudaFree(testImage)); 

    } 
+1

Почему ширина и высота отменены в аргументах, предоставляемых вызову ядра? – talonmies

+0

@talonmies D'oh! Я полностью пропустил это! Код работает сейчас, спасибо! – Eagle

ответ

0

Аргументы ширина и высота были переключены в вызове ядра, и это было причина ошибки. Все работает, когда это исправлено. Это скорректированное ядро:

__global__ void 
copySlice2Volume2(float *buffer, float *slice, int width, int height, int frameIdx) 
{ 

    int tid = (blockIdx.x * width) + threadIdx.x; 
    buffer[tid + (frameIdx*width*height)] = slice[tid]; 

    __syncthreads(); 

} 
Смежные вопросы