我有使用恒定内存的设备/主机功能。它在设备上运行正常,但在主机上似乎该内存仍未初始化。
#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 答案的评论的意思,也许我应该发布我自己的答案。我什么meant是这样的:
__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
on the __constant__
array.
一个更现实的完整例子:
#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();
}
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)