Я пытаюсь преобразовать массив значений RGBRGB в массив значений RRGGBB, используя CUDA. Код, который у меня есть сейчас:
__global__ void convertToo(UCHAR *imageData, UCHAR *outData, size_t dataSize)
{
size_t i = threadIdx.x + blockIdx.x * blockDim.x;
if (i >= dataSize) return;
auto index = ((i % 3) * (dataSize / 3)) + i;
if (index >= dataSize) return;
auto iVal = imageData[i];
outData[index] = iVal;
}
(индекс и Ival существуют для целей отладки)
Код, который вызывает это:
auto blockSize = size / 1024;
convertToo <<<blockSize, 1024>> > (imageData, outData, size * sizeof(UCHAR));
Где imageData - это массив, содержащий значения RGB, а outData - то, куда должны отправляться вновь отформатированные данные.
CImg<unsigned char> image(s.c_str());
CImg<unsigned char> result(s.c_str());
size_t old_sizeX = image.width();
size_t old_sizeY = image.height();
size_t old_spectrum = image.spectrum();
size_t old_depth = image.depth();
size_t size = image.size();
image.permute_axes("cxyz");
UCHAR *imageData, *outData;
gpuErrchk(cudaMalloc(&imageData, sizeof(UCHAR) * size));
gpuErrchk(cudaMalloc(&outData, sizeof(UCHAR) * size));
gpuErrchk(cudaDeviceSynchronize());
unsigned char *data = image.data();
gpuErrchk(cudaMemcpy(imageData, data, sizeof(UCHAR) * size, cudaMemcpyHostToDevice));
gpuErrchk(cudaDeviceSynchronize());
auto blockSize = size / 1024;
convertToo <<<blockSize, 1024>> > (imageData, outData, size * sizeof(UCHAR));
gpuErrchk(cudaDeviceSynchronize());
gpuErrchk(cudaPeekAtLastError());
gpuErrchk(cudaMemcpy(result.data(), outData, size * sizeof(UCHAR), cudaMemcpyDeviceToHost));
image.permute_axes("yzcx");
CImgDisplay main_disp(image, "Original image");
CImgDisplay main_disp2(result, "Blurred image");
while (1)
{
main_disp.wait();
main_disp2.wait();
}
std::cout << "Done" << std::endl;
Проблема, которую я получаю, состоит в том, что, когда я снова соединяю изображение, я не получаю тот же результат (используя CImg), который я должен логически получить. Я попытался просмотреть каждый массив и посмотреть, верны ли они, но, похоже, проблема не обнаружена.