C++ CUDAEMCPY2DFROMARRAY导致cudaErrorInvalidValue

C++ CUDAEMCPY2DFROMARRAY导致cudaErrorInvalidValue,c++,opengl,cuda,C++,Opengl,Cuda,我在使用OpenGL CUDA Interopt时遇到一些问题 我的设置如下所示: 我正在使用FrameBufferObject进行纹理渲染(效果非常好),我是这样创建的: void createFrameBuffer(){ // Create the texture for the FBO glGenTextures(1, &tex_data); glBindTexture(GL_TEXTURE_2D, tex_data); SDK_CHECK_ERR

我在使用OpenGL CUDA Interopt时遇到一些问题 我的设置如下所示:

我正在使用FrameBufferObject进行纹理渲染(效果非常好),我是这样创建的:

void createFrameBuffer(){

    // Create the texture for the FBO
    glGenTextures(1, &tex_data);
    glBindTexture(GL_TEXTURE_2D, tex_data);
    SDK_CHECK_ERROR_GL();
    glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_CLAMP_TO_EDGE);
    glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_CLAMP_TO_EDGE);
    glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_NEAREST);
    glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_NEAREST);

    glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA16F , window_w, window_h, 0, GL_RGBA, GL_FLOAT, NULL);

    // Create the frameBuffer
    glGenFramebuffersEXT(1, &fbo);
    glBindFramebufferEXT(GL_FRAMEBUFFER_EXT, fbo);
    // Register the texture with cuda
    checkCudaErrors(cudaGraphicsGLRegisterImage(&res_data, tex_data, GL_TEXTURE_2D, cudaGraphicsMapFlagsReadOnly));
    SDK_CHECK_ERROR_GL();
    // attach images

    glGenRenderbuffersEXT(1, &depth_rb);
    glBindRenderbufferEXT(GL_RENDERBUFFER_EXT, depth_rb);
    glRenderbufferStorageEXT(GL_RENDERBUFFER_EXT, GL_DEPTH_COMPONENT24, window_w, window_h);
    //-------------------------


    glFramebufferTexture2DEXT(GL_FRAMEBUFFER_EXT, GL_COLOR_ATTACHMENT0_EXT, GL_TEXTURE_2D, tex_data, 0);
       //Attach depth buffer to FBO
    glFramebufferRenderbufferEXT(GL_FRAMEBUFFER_EXT, GL_DEPTH_ATTACHMENT_EXT, GL_RENDERBUFFER_EXT, depth_rb);
    //glFramebufferRenderbufferEXT(GL_FRAMEBUFFER_EXT, GL_COLOR_ATTACHMENT0_EXT, GL_RENDERBUFFER_EXT, color);
    //glFramebufferRenderbufferEXT(GL_FRAMEBUFFER_EXT, GL_DEPTH_ATTACHMENT_EXT, GL_RENDERBUFFER_EXT, depth);

    // clean up
    glBindFramebufferEXT(GL_FRAMEBUFFER_EXT, 0);
    SDK_CHECK_ERROR_GL();
}
目前我没有内核,但我想将OpenGL中的纹理转换成可以与CUDA一起使用的东西。以下是我试图转换的内容:

void processImage(){
    cudaArray *cuda_data = 0;
    checkCudaErrors( cudaGraphicsGLRegisterImage(&res_data, tex_data, GL_TEXTURE_2D, cudaGraphicsRegisterFlagsReadOnly));
    float *dData; // Array holding the data
    std::cout << "cudaMalloc " << std::endl;
    checkCudaErrors( cudaMalloc(&dData, window_w * window_h*4*sizeof(float)));   

    std::cout << "Mapping Resource" << std::endl;
    checkCudaErrors( cudaGraphicsMapResources(1, &res_data) );

    std::cout << "cudaGraphicsSubResourceGetMappedArray" << std::endl;
    checkCudaErrors( cudaGraphicsSubResourceGetMappedArray(&cuda_data, res_data, 0, 0));

    std::cout << "cudaMemcpy2DFromArray" <<  std::endl;
    // Copy from the texture to the graphic Card
    checkCudaErrors( cudaMemcpy2DFromArray(dData, window_w*4*sizeof(float), cuda_data ,0 ,0, window_w*4*sizeof(float), window_h, cudaMemcpyDeviceToDevice));

    std::cout << "cudaGraphicsUnmapResources" << std::endl;
    // Unmap the resource
    checkCudaErrors( cudaGraphicsUnmapResources(1, &res_data));
}
void processImage(){
cuda阵列*cuda_数据=0;
检查CUDAErrors(cudaGraphicsGLRegisterImage(&res_数据、tex_数据、GL_纹理_2D、cudaGraphicsRegisterFlagsReadOnly));
float*dData;//保存数据的数组

std::难道你还没有提供其他人可以编译和运行的复制案例,但我猜问题是你提供给
cudaMemcpy2DFromArray
的cuda内存分配间距无效。你应该使用
cudamaloc2d
分配内存以获得内存间距。
cudamaloc2d
=>cudamalocp痒