Поскольку 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 ', но он более гибок перед лицом реального кода: он позволяет вам иметь значения, определенные во время выполненияв ваших постоянных массивах, например, и позволяет вам использовать функции API CUDA, такие как 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();
}