CUDA主机和设备使用相同的__constant__内存

标签 cuda

我有使用恒定内存的设备/主机功能。它可以在设备上正常运行,但是在主机上似乎该内存尚未初始化。

#include <iostream>
#include <stdio.h>


const __constant__ double vals[2] = { 0.0, 1000.0 };

__device__ __host__ double f(size_t i)
{
    return vals[i];
}

__global__ void kern()
{
    printf("vals[%d] = %lf\n", threadIdx.x, vals[threadIdx.x]);
}

int main() {
    std::cerr << f(0) << " " << f(1) << std::endl;
    kern<<<1, 2>>>();
    cudaThreadSynchronize();
}

打印(需要CC 2.0或更高版本)
0 0
vals[0] = 0.000000
vals[1] = 1000.000000

问题出在哪里,如何才能同时初始化设备和主机内存常量?

最佳答案

由于CygnusX1误解了我对MurphEngineer答案的评论的意思,所以也许我应该发布自己的答案。我的意思是这样的:

__constant__ double dc_vals[2] = { 0.0, 1000.0 };
       const double hc_vals[2] = { 0.0, 1000.0 };

__device__ __host__ double f(size_t i)
{
#ifdef __CUDA_ARCH__
    return dc_vals[i];
#else
    return hc_vals[i];
#endif
}

这具有与Cygnus相同的结果,但是面对实际代码则更加灵活:例如,它使您可以在常量数组中具有运行时定义的值,并允许您使用CUDA API函数(如cudaMemcpyToSymbol/cudsaMemcpyFromSymbol) __constant__数组。

一个更现实的完整示例:
#include <iostream>
#include <stdio.h>

__constant__ double dc_vals[2];
       const double hc_vals[2];

__device__ __host__ double f(size_t i)
{
#ifdef __CUDA_ARCH__
    return dc_vals[i];
#else
    return hc_vals[i];
#endif
}

__global__ void kern()
{
    printf("vals[%d] = %lf\n", threadIdx.x, vals[threadIdx.x]);
}

int main() {
    hc_vals[0] = 0.0;
    hc_vals[1] = 1000.0;

    cudaMemcpyToSymbol(dc_vals, hc_vals, 2 * sizeof(double), 0, cudaMemcpyHostToDevice);

    std::cerr << f(0) << " " << f(1) << std::endl;
    kern<<<1, 2>>>();
    cudaThreadSynchronize();
}

关于CUDA主机和设备使用相同的__constant__内存,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9457572/

相关文章:

c++ - 具有共享内存的 cuda 平铺 3d 卷积实现

c++ - 使用 GPU Ocelot 时出现 GCC 链接器错误 (cudaMemGetInfo)

c++ - CUDA 归约和样本 : data racing?

c++ - 管理二维 CUDA 阵列

cuda - pycuda::complex 数组上的元素明智函数

caching - GPU L2 缓存命中率为 100%,DRAM 加载事务有时为 0

arrays - CUDA:固定大小的数组存储在哪个内存空间?

arrays - 用于数组处理的 GPU cuda 代码,摘要

cuda - 在 CUDA 9 中附加了一些以 `_sync()` 命名的内在函数;语义相同?

c++ - CUDA 不适用于 Visual Studio 2013 - 工具包 4.2、5.5 和 6