gpt4 book ai didi

cuda - 警告 : calling a __host__ function from a __host__ __device__ function is not allowed

转载 作者:行者123 更新时间:2023-12-05 05:12:57 31 4
gpt4 key购买 nike

我引用了几乎所有类似的问题,但没有找到答案。错误检查被很多人推荐,所以我尝试使用CHECKED_CALL() 类型的宏来使程序更强大,但是我的代码遇到了两个问题:

  1. 正如标题所说,我收到了一条警告消息,但是在我使用#pragma hd_warning_disable 之前,我收到了错误消息:

    cuEntityIDBuffer.cu(9):错误:设备代码中未定义标识符“stderr”

  2. 当我编译maintest.cpp时,我得到另一个错误:

编辑:

 g++ -c maintest.cpp -std=c++11
cuEntityIDBuffer.h:1:27: fatal error: thrust/reduce.h: No such file or directory

但是,编译cuEntityIDBuffer.cu时它工作正常cuEntityIDBuffer.h也包含在这个文件中。
nvcc -arch=sm_35 -Xcompiler '-fPIC' -dc cuEntityIDBuffer.cu

cuEntityIDBuffer.cumaintest.cpp #include "cuEntityIDBuffer.h",但是maintest.cpp 抛出一个错误,我对此一无所知。

代码如下:

cuEntityIDBuffer.h

#include <thrust/reduce.h>
#include <thrust/execution_policy.h>
#include <stdio.h>
#include <assert.h>
#include <cuda_runtime.h>

#ifdef __CUDACC__
#define CUDA_CALLABLE_MEMBER __host__ __device__
#else
#define CUDA_CALLABLE_MEMBER
#endif

class cuEntityIDBuffer
{
public:
CUDA_CALLABLE_MEMBER cuEntityIDBuffer();
CUDA_CALLABLE_MEMBER cuEntityIDBuffer(unsigned int* buffer);
CUDA_CALLABLE_MEMBER void cuCallBackEntityIDBuffer(unsigned int* buffer);
CUDA_CALLABLE_MEMBER ~cuEntityIDBuffer();
CUDA_CALLABLE_MEMBER void cuTest();
private:
size_t buffersize;
unsigned int* cuBuffer;
};

cuEntityIDBuffer.cu

#include "cuEntityIDBuffer.h"
#include <stdio.h>
#pragma hd_warning_disable
#define nTPB 256
#define gpuErrchk(ans) { gpuAssert((ans), __FILE__, __LINE__); }
inline void gpuAssert(cudaError_t code, const char *file, int line, bool abort=true)
{
if (code != cudaSuccess)
{
fprintf(stderr,"GPUassert: %s %s %d\n", cudaGetErrorString(code), file, line);
if (abort) exit(code);
}
}

__global__ void mykernel(unsigned int* buffer)
{
int idx = threadIdx.x + (blockDim.x * blockIdx.x);
buffer[idx]++;
//other things.
}

cuEntityIDBuffer::cuEntityIDBuffer()
{
buffersize=1024;
gpuErrchk(cudaMalloc(&cuBuffer, buffersize * sizeof(unsigned int)));
}

cuEntityIDBuffer::cuEntityIDBuffer(unsigned int* buffer)
{
buffersize=1024;
gpuErrchk(cudaMalloc(&cuBuffer, buffersize * sizeof(unsigned int)));
gpuErrchk(cudaMemcpy(cuBuffer,buffer,buffersize*sizeof(unsigned int),cudaMemcpyHostToDevice));
}

void cuEntityIDBuffer::cuCallBackEntityIDBuffer(unsigned int* buffer)
{
gpuErrchk(cudaMemcpy(buffer,cuBuffer,buffersize*sizeof(unsigned int),cudaMemcpyDeviceToHost));
}

cuEntityIDBuffer::~cuEntityIDBuffer()
{
gpuErrchk(cudaFree((cuBuffer)));
}

void cuEntityIDBuffer::cuTest()
{
mykernel<<<((buffersize+nTPB-1)/nTPB),nTPB>>>(cuBuffer);
gpuErrchk(cudaPeekAtLastError());
}

maintest.cpp

#include "cuEntityIDBuffer.h"
#include <iostream>

int main(int argc, char const *argv[])
{
unsigned int *h_buf;
h_buf=malloc(1024*sizeof(unsigned int));
cuEntityIDBuffer d_buf(h_buf);
d_buf.cuTest();
d_buf.cuCallBackEntityIDBuffer(h_buf);
return 0;
}

是我使用CHECKED_CALL()类型宏的方式不对还是我的代码组织有问题?任何建议表示赞赏。

最佳答案

您的方法定义为 __host____device,这意味着它们将为 CPU 编译一次,为设备编译一次。我看不出 CPU 版本有什么大问题。但是,您的设备版本有两个问题:

  • cuEntityIDBuffer.cu(9): error: identifier "stderr"is undefined in device code 很清楚,你正在尝试使用 CPU 变量 stderr在设备代码中。

  • warning: calling a __host__ function from a __host__ __device__ function is not allowed 是同一类问题:没有任何 __host__, __device__ __global__ 属性,符号隐式设置为 __host__,这意味着在您的情况下,您的方法的设备版本正在尝试使用 gpuAssert 仅在 CPU 端。

对于 cuEntityIDBuffer.h:1:27: fatal error: thrust/reduce.h: No such file or directory,正如@Talonmies 指出的那样,任何 Thrust 代码都必须使用 nvcc 构建。

关于cuda - 警告 : calling a __host__ function from a __host__ __device__ function is not allowed,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54143338/

31 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com