C++ 为什么我得到设备[1]的当前表转储:代码中的NVIDIA Tesla GPU 0?

C++ 为什么我得到设备[1]的当前表转储:代码中的NVIDIA Tesla GPU 0?,c++,gpu,openacc,pgi,pgi-accelerator,C++,Gpu,Openacc,Pgi,Pgi Accelerator,这是一个头文件DataHolder.h: #ifndef DATAHOLDER_H #define DATAHOLDER_H using FloatingType=float; int LIFE=0; const int GL=2000000; template <typename Floating> class DataHolder { public: Floating particles[GL]; public: DataHolder(){} ~DataHolder()

这是一个头文件DataHolder.h:

#ifndef DATAHOLDER_H
#define DATAHOLDER_H
using FloatingType=float;
int LIFE=0;
const int GL=2000000;
template <typename Floating> class DataHolder {
public:
  Floating particles[GL];
public:
  DataHolder(){}
 ~DataHolder(){}
 void Propagate();
 void InitParticle();
 };
template <typename Floating> void DataHolder<Floating>::Propagate()
{
#pragma acc parallel loop copy(LIFE) present(particles)
  for(int i=0; i<LIFE; ++i) Floating r0= particles[i];
}
template <typename Floating> void DataHolder<Floating>::InitParticle()
{
#pragma acc parallel num_gangs(1) vector_length(1) 
present(particles[0:GL]) copy(LIFE)
{
  particles[LIFE]=0.0f;
#pragma acc atomic update
  ++LIFE;
}
}
#endif//DATAHOLDER_H

使用PGI 19.4 C++编译器、GCC 5.3.1、OS FEDORA 23 X8664、CUDA 10.1、CUDA驱动程序版本418.67。

< P>“当前”子句检查该特定变量是否存在于设备上,但只能检查OpenAccC运行时管理的变量。在这里,您通过运行时不管理的Cudamaloc分配数据。在这些情况下,您应该将“present”替换为“deviceptr”,以告知运行时它是CUDA设备指针。您需要添加“this”指针,因为它也是一个设备指针

但是,您的代码随后将在主机上seg fault,因为您取消引用的“d”不是有效的主机指针


这里最简单的解决方案不是使用cudamaloc,而是使用“new”分配“d”。由于您使用的是CUDA统一内存,“d”的数据移动将由CUDA驱动程序处理。

Stack Overflow是一个问答网站,用于解答有关实际代码的特定问题。您需要学会调试代码。形式为“此代码不工作”的问题不在堆栈溢出主题上,可能会被否决。有关更多信息,请参阅。
#include <iostream>
#include "DataHolder.h"
#include <accelmath.h>
#include <openacc.h>
#include <cuda.h>
#include <cuda_runtime.h>
int main(int argc, char **argv)
{
  DataHolder<FloatingType> * d;
  cudaMalloc((void**) & d, sizeof(DataHolder<FloatingType>));
  std::cout<<"sizeof(DataHolder<FloatingType>)=" 
  <<sizeof(DataHolder<FloatingType>)/1024/1024<<" MB"<<std::endl;  
  LIFE=0;
  int step=0;
  d->InitParticle();
  cudaFree(d);
}
cmake . -DCMAKE_C_COMPILER=pgcc -DCMAKE_CXX_COMPILER=pgc++ - 
DCMAKE_CXX_FLAGS="-acc -mcmodel=medium =ta=tesla:cc30,managed -fast - 
Mcuda=cuda10.1 --c++11"