如何将cuda运行时函数分配给函数指针

问题描述 投票:0回答:1

假设我有以下代码

#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 运行时函数的函数指针。

c++ function cuda
1个回答
0
投票

作为解决方法,您可以围绕 cuda 运行时函数创建一个简单的包装器,并使用

std::call_once

包装器只是将调用转发给 cuda 函数:

#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);
}
© www.soinside.com 2019 - 2024. All rights reserved.