Я пытался хранить не квадратные изображения в томе. Мой код работает, когда я хочу сохранить 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));
}
Почему ширина и высота отменены в аргументах, предоставляемых вызову ядра? – talonmies
@talonmies D'oh! Я полностью пропустил это! Код работает сейчас, спасибо! – Eagle