Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/design-patterns/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
cuda使用恒定内存作为二维数组_Cuda_Gpu Constant Memory - Fatal编程技术网

cuda使用恒定内存作为二维数组

cuda使用恒定内存作为二维数组,cuda,gpu-constant-memory,Cuda,Gpu Constant Memory,我正在一个多线程的“主机”程序中实现我的内核,其中每个主机线程都在调用内核。 我在使用常量内存方面遇到了问题。在常量内存中会放置一些参数,但对于每个线程,它们是不同的。 我也在出现问题的地方构建了一个示例 这是内核 __global__ void Kernel( int *aiOutput, int Length ) { int id = threadIdx.x + blockIdx.x * blockDim.x; int iValue = 0; // bound c

我正在一个多线程的“主机”程序中实现我的内核,其中每个主机线程都在调用内核。 我在使用常量内存方面遇到了问题。在常量内存中会放置一些参数,但对于每个线程,它们是不同的。 我也在出现问题的地方构建了一个示例

这是内核

__global__ void Kernel( int *aiOutput, int Length )
{
    int id = threadIdx.x + blockIdx.x * blockDim.x;

    int iValue = 0;

    // bound check
    if( id < Length )
    {
        if( id % 3 == 0 )
            iValue = c_iaCoeff[2];
        else if( id % 2 == 0 )
            iValue = c_iaCoeff[1];
        else
            iValue = c_iaCoeff[0];

        aiOutput[id] = iValue;
    }
    __syncthreads();
}
对于每个主机,线程在
h_piCoeff
中具有不同的值,并将其复制到常量内存中

CUDA_CHECK_RETURN( cudaMemcpyToSymbol( c_iaCoeff[_params->iTId], _params->h_piCoeff, 3*sizeof(int) ) );
现在我为每个pthread调用得到相同的结果,因为它们在
c_iaCoeff
中得到相同的值。 我认为这就是常量内存如何工作的问题,必须在上下文中声明—在示例中,对于所有pthreads调用,只有一个
c_iaCoeff
声明,pthreads调用的内核将获得最后一个
cudaMemcpyToSymbol
的值。是这样吗

现在我试图改变二维数组中的常量内存。 第二个维度和前面一样是值,但第一个维度是所用pthread的索引

__constant__ int c_iaCoeff2[ THREADS ][ 3 ];
在内核中,它的使用将是这样的

iValue = c_iaCoeff2[iTId][2];
但我不知道是否有可能以这种方式使用常量内存,是吗? 当我试图将数据复制到常量内存时,我也遇到了一个错误

CUDA_CHECK_RETURN( cudaMemcpyToSymbol( c_iaCoeff[_params->iTId], _params->h_piCoeff, 3*sizeof(int) ) );

常规是否可以将常量内存用作二维数组?如果可以,我的失败在哪里?

是的,您应该能够以您想要的方式使用常量内存,但是您使用的
cudamemcpytosym
复制操作不正确。调用的第一个参数是符号,API在运行时符号表中进行查找,以获取您请求的常量内存符号的地址。因此无法将地址传递给调用(尽管您的代码实际上是在向调用传递一个初始化的主机值,但这是为什么我将留给读者作为练习)

您可能遗漏了调用中可选的第四个参数,它是您请求的符号指向的内存中的偏移量。因此,您应该能够执行以下操作:

cudaMemcpyToSymbol( c_iaCoeff,                    // symbol to lookup
                    _params->h_piCoeff,           // source location
                    3*sizeof(int),                // number of bytes to copy
                    (3*_params->iTId)*sizeof(int) // Offset in bytes
                   );
[标准免责声明:在浏览器中编写,未声明。使用风险自负]


最后一个参数是从符号开始的偏移量(以字节为单位)。您的2D数组将按行主顺序排列,因此您需要使用行间距乘以行索引作为每次复制操作的偏移量。

非常感谢,它以这种方式工作得非常完美。我不知道偏移量。
cudaMemcpyToSymbol( c_iaCoeff,                    // symbol to lookup
                    _params->h_piCoeff,           // source location
                    3*sizeof(int),                // number of bytes to copy
                    (3*_params->iTId)*sizeof(int) // Offset in bytes
                   );