CUDA:不明白为什么这个测试程序不';我好像什么也没做

CUDA:不明白为什么这个测试程序不';我好像什么也没做,cuda,Cuda,我有一个CUDA测试程序,可以反转图像的RGB值。至少在我的系统上,这是一个输出图像,但它是完全透明的 这里是CudaLodepng.cu #include <stdio.h> #include <stdlib.h> #include "lodepng.h" __global__ void NegativeFilter(unsigned char *inputImage, unsigned char *outputImage) { in

我有一个CUDA测试程序,可以反转图像的RGB值。至少在我的系统上,这是一个输出图像,但它是完全透明的

这里是CudaLodepng.cu

#include <stdio.h>
#include <stdlib.h>

#include "lodepng.h"


__global__
void NegativeFilter(unsigned char *inputImage, unsigned char *outputImage)
{

    int r;
    int g;
    int b;
    int t;

    int threadIndex = blockDim.x * blockIdx.x + threadIdx.x;

    int pixel = threadIndex * 4;

    printf("uid = %d\n", pixel);

    r = inputImage[pixel];
    g = inputImage[pixel+1];
    b = inputImage[pixel+2];
    t = inputImage[pixel+3];

    outputImage[pixel] = 255-r;
    outputImage[pixel+1] = 255-g;
    outputImage[pixel+2] = 255-b;
    outputImage[pixel+3] = t;

}


int main(int argc, char ** argv){

  unsigned int errorDecode;
  unsigned char* cpuImage;
  unsigned int width, height;
  
  char *filename = argv[1];
  char *newFilename = argv[2];

  errorDecode = lodepng_decode32_file(&cpuImage, &width, &height, filename);
  if(errorDecode){
    printf("error %u: %s\n", errorDecode, lodepng_error_text(errorDecode));
  }
  
  int arraySize = width*height*4;
  int memorySize = arraySize * sizeof(unsigned char);
  
  unsigned char *cpuOutImage = (unsigned char*)malloc(memorySize);
  
  unsigned char* gpuInput;
  unsigned char* gpuOutput;
  
  cudaMalloc((void**)&gpuInput, memorySize);
  cudaMalloc((void**)&gpuOutput, memorySize);
  
  cudaMemcpy(gpuInput, cpuImage, memorySize, cudaMemcpyHostToDevice);
  
  NegativeFilter<<<1, width * height>>>(gpuInput, gpuOutput);
  cudaDeviceSynchronize();

  cudaMemcpy(cpuOutImage, gpuOutput, memorySize, cudaMemcpyDeviceToHost);
  
  unsigned int errorEncode = lodepng_encode32_file(newFilename, cpuOutImage, width, height);
  if(errorEncode) {
  printf("error %u: %s\n", errorEncode, lodepng_error_text(errorEncode));
  }

  cudaFree(gpuInput);
  cudaFree(gpuOutput);

  free(cpuImage);
  free(cpuOutImage);

}
如果您不想麻烦下载loadpng并在文件上运行此代码,那么您可以在代码本身中发现问题。我已经找了一个小时左右了,想不出来

我对CUDA并不陌生,但我已经有5年没有做过任何事情了,所以这让我有点吃惊,因为它似乎什么都没做

(顺便说一句,它的编译和运行都很好,但输出在我的系统上只是一个透明的图像。我已经用一个包含4个彩色方块的4x4测试图像对它进行了测试。你可以用gimp完成同样的事情。我会在下面附上测试图像,但我不知道数据是否能正确传输。它是一个32位png,据说是rgba格式。)

在这里寻找真正微小的图像

VVVV


^^^^^^

与上面的代码完全无关:问题是我使用的是一台带有离散嵌入式GPU的linux笔记本电脑

optirun ./a.out
在英伟达GPU上执行CUDA代码需要


我本来会删除这个问题,但是在Linux系统上可能有其他人有类似的配置,阅读这个答案可能会避免他们浪费几个小时去寻找一个不存在的问题的解决方案。(代码中的又名)

使用
cuda memcheck
运行代码,如下所示:
cuda memcheck./a.out image.png imageout.png
如果它报告了任何错误,请将输出编辑到您的问题中。没有memcheck错误,我已经意识到错误所在。见答案。(这与代码无关。)
optirun ./a.out