假设我有以下代码
#include <mutex>
__device__ int d_run;
__global__ void kernel()
{
d_run = 1
}
int main()
{
kernel<<<1, 1>>>();
int run;
std::once_flag flag;
std::call_once(flag, cudaMemcpyFromSymbol, &run, "d_run", sizeof(run), 0, cudaMemcpyDeviceToHost);
}
我收到以下错误消息
no instance of function template "std::call_once" matches the argument list
argument types are: (std::once_flag, <unknown-type>, int *, const char [6], unsigned long, int, cudaMemcpyKind)
编译器似乎无法判断函数的类型
cudaMemcpyFromSymbol
。作为解决方法,您可以围绕 cuda 运行时函数创建一个简单的包装器,并使用
std::call_once
。#include <mutex>
__device__ int d_run;
__global__ void kernel()
{
d_run = 1;
}
cudaError_t CUDARTAPI cudaMemcpyFromSymbol_Wrapper(void* dst, const void* symbol, size_t count, size_t offset, enum cudaMemcpyKind kind)
{
return cudaMemcpyFromSymbol(dst, symbol, count, offset, kind);
}
int main()
{
kernel << <1, 1 >> > ();
int run;
std::once_flag flag;
std::call_once(flag, cudaMemcpyFromSymbol_Wrapper, &run, "d_run", sizeof(run), 0, cudaMemcpyDeviceToHost);
}