【问题标题】:Binding a two dimensional array to the texture memory of a GPU with cudaBindTexture2D produces an error使用 cudaBindTexture2D 将二维数组绑定到 GPU 的纹理内存会产生错误
【发布时间】:2012-11-28 15:23:02
【问题描述】:

我正在尝试使用 CUDA API 在计算能力 1.3 GPU 中执行内核。绑定一维数组按预期工作,但以下代码会产生错误:

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

#define checkCudaErrors(err)           __checkCudaErrors (err, __FILE__, __LINE__)

inline static void __checkCudaErrors( cudaError err, const char *file, const int line )     {

    if( cudaSuccess != err) {
        fprintf(stderr, "%s(%i) : CUDA Runtime API error %d: %s.\n", file, line, (int)err, cudaGetErrorString( err ) );
        exit(-1);
    }
}

texture<int, cudaTextureType2D> tex_transition;

int main ( void ) {

    int m = 8, p_size = 100, alphabet = 20;

    size_t pitch;

    int *transition = ( int * ) malloc ( ( m * p_size + 1 ) * alphabet * sizeof ( int ) );
    memset ( transition, -1, ( m * p_size + 1 ) * alphabet * sizeof ( int ) );

    int *d_transition;

    checkCudaErrors ( cudaMallocPitch ( &d_transition, &pitch, alphabet * sizeof ( int ), ( m * p_size + 1 ) ) );

    checkCudaErrors ( cudaMemcpy2D ( d_transition, pitch, transition, alphabet * sizeof ( int ), alphabet * sizeof ( int ), ( m * p_size + 1 ), cudaMemcpyHostToDevice ) );

    cudaChannelFormatDesc desc = cudaCreateChannelDesc<int>();
    checkCudaErrors ( cudaBindTexture2D ( 0, tex_transition, d_transition, desc, alphabet * sizeof ( int ), ( m * p_size + 1 ), pitch ) );

    cudaFree ( d_transition );

    return 0;
}

执行时出现错误“test.cu(33) : CUDA Runtime API error 11: invalid argument。 “。通过将字母设置为 10,错误消失了。如果我没记错的话,每个绑定到纹理的数组的最大大小可以是 65000 x 65000 字(在本例中为整数),但 transition 数组小得多。

【问题讨论】:

  • 这是对 cudaBindTexture2D() 的调用

标签: c cuda


【解决方案1】:

您在 cudaBindTexture2D 调用中的参数之一错误。纹理的尺寸以 texel 为单位,而不是字节,所以调用应该是:

cudaChannelFormatDesc desc = cudaCreateChannelDesc<int>();
cudaBindTexture2D ( 0, 
                    tex_transition, 
                    d_transition, desc, 
                    alphabet,            // in texels
                    ( m * p_size + 1 ),  // in texels
                    pitch );

字节宽度仅在分配调用中是必需的。纹理绑定使用 pitch 参数来计算 2D 分配的内存布局。

【讨论】:

  • 这似乎只适用于 cudaBindTexture2D()?。如果我理解正确,一维 cudaBindTexture() 函数需要字节大小。
  • 是的,一维纹理大小以字节为单位指定
猜你喜欢
  • 2011-10-16
  • 1970-01-01
  • 1970-01-01
  • 2011-09-12
  • 2016-09-02
  • 2012-02-22
  • 2020-08-08
  • 2021-10-05
  • 1970-01-01
相关资源
最近更新 更多