- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我引用了几乎所有类似的问题,但没有找到答案。错误检查被很多人推荐,所以我尝试使用CHECKED_CALL()
类型的宏来使程序更强大,但是我的代码遇到了两个问题:
正如标题所说,我收到了一条警告消息,但是在我使用#pragma hd_warning_disable
之前,我收到了错误消息:
cuEntityIDBuffer.cu(9):错误:设备代码中未定义标识符“stderr”
当我编译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.cu
和maintest.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/
CUDA 专家,如果我在主机代码中定义了一个新类型: struct float_3{ float x; float y; float z; }; 并且我已经向设备传输了一些这种类型的数据,我可以
我正在尝试在 __device__ 变量上应用内核函数,根据规范,该变量驻留在“全局内存中” #include #include "sys_data.h" #include "my_helper.c
在 http://docs.nvidia.com/cuda/cuda-c-programming-guide/#device-variable-qualifier它说 __device_ 限定符变量具
这个问题在这里已经有了答案: Check whether the code is running on the GPU or CPU (2 个回答) 7年前关闭。 我想写一些主机和设备兼容的函数,并根
有什么区别,在 CUDA 程序中定义设备常量的最佳方法是什么?在 C++,主机/设备程序中,如果我想将常量定义在设备常量内存中,我可以这样做 __device__ __constant__ float
我有一个内核,它在 if 语句中调用 device 函数。代码如下: __device__ void SetValues(int *ptr,int id) { if(ptr[threadIdx
这个问题在这里已经有了答案: External calls are not supported - CUDA (1 个回答) 关闭 7 年前。 我试图了解如何在单独的头文件中解耦 CUDA __de
如果 CUDA 内核调用 __device__ 函数, block 中进入或退出 __device__ 函数的所有线程之间是否存在任何隐式同步? 如果不是那么这意味着 block 中的一些线程可能在
我正在尝试使用 NVCC 选项获取有关我的 CUDA 内核中寄存器使用情况的一些信息 --ptxas-options=v 虽然全局函数一切正常,但我在设备函数方面遇到了一些困难,因为 ptxas信息:
在 CUDA 代码的实现过程中,我经常需要一些实用函数,这些函数将从设备和主机代码中调用。所以我将这些函数声明为 __host__ __device__。这是可以的,可能的设备/主机不兼容可以通过#i
我有一些工作代码...我在其中分配了一个设备变量指针,如下所示: float *d_var; cudaMalloc(&d_var, sizeof(float) ); 稍后在我的代码中,我想将此 var
我对我编写的 CUDA 代码的行为感到困惑。我正在为名为 DimmedGridGPU 的类中的 __device__ 函数编写测试。此类以 int DIM 为模板,我遇到的函数是返回距离输入值 x 最
我正在使用 __device__ 说明符在设备上声明一个全局变量 myvar。我没有在任何地方将它设置为有意义的值(没有像您通常那样在我的内核启动方法中使用 cudaMemcpyToSymbol)。
我有一个在主机和设备代码上都使用的类,以便更轻松地传递数据。这个类有一些操作数据的方法。一个简单的例子是: struct Vector { float x, y, z; __host__ __
在 CUDA 函数类型限定符 __device__ 和 __host__ 中可以一起使用,在这种情况下函数是为主机和设备编译的。这允许消除复制粘贴。但是,没有 __host__ __device__
我想从执行基数排序的内核内部调用独占扫描函数。但是独占扫描只需要一半的线程来完成它的工作。 独占扫描算法中需要几个 __syncthreads()。如果我在开始时有一个声明,例如 if(threadI
我不明白为什么我会收到错误 dynamic initialization is not supported for __device__, __constant__, __shared__ varia
我正在 NVIDIA CUDA GPU 上研究马尔可夫链蒙特卡罗 (MCMC) 算法实现。 CPU MCMC 算法使用高质量的 Mersenne twiner 随机数生成器,我想在我编写的 GPU 内
CUDA 有没有办法在设备端函数中动态分配内存? 我找不到任何这样做的例子。 从 CUDA C 编程手册: B.15 Dynamic Global Memory Allocation void* ma
我在很多地方读到过,__device__ 函数几乎总是由 CUDA 编译器内联。那么,当我将代码从内核移动到内核调用的__device__函数时,(通常)使用的寄存器数量不会增加,这样说是否正确? 例
我是一名优秀的程序员,十分优秀!