accelerator.cu(8): 错误:属性"managed"在这里不适用?
accelerator.cu(8): error: attribute "managed" does not apply here?
我正在编写的程序(Accelerator.cu)将无法在NVCC 8.0.61下编译,nvcc -std=c++11 -o accelerator accelerator.cu
。对于__device__
、__global__
和__shared__
失败的原因,还有其他答案,但没有一个在自定义代码中揭示此错误的原因。我正在尝试遵循指南 https://docs.nvidia.com/cuda/cuda-c-programming-guide/index.html#um-global-scope。但是,在尝试以下代码时:
#include <cuda_runtime_api.h>
#include <cuda.h>
// CUDA Acceleration Adapter.
class Accelerator {
public:
__device__ __managed__ float** A;
__device__ __managed__ float* B;
__device__ __managed__ int N;
__device__ __managed__ int C;
Accelerator () {}
Accelerator (int N, int C) {
// initialize variables (unified memory).
N = records;
// are "inputs"
this->C = C;
}
void setData (vector<vector<float>>& A, vector<float>& B) {
// convert vectors to arrays that the GPU can address.
}
void accelerate (vector<float>& results) {
// run kernel.
// convert results back to vector.
}
__global__ void evaluate (float **A, float *B, int N, int C) {
// do stuff.
}
};
void main () {
Accelerator testAcc();
}
但是,我收到所有A
的错误
accelerator.cu(8): error: attribute "device" does not apply here
accelerator.cu(8): error: attribute "managed" does not apply here
以及其余 3 个成员变量的类似错误。
这是我第一次尝试编写自己的GPU加速程序。如果有人知道出了什么问题,将不胜感激。
您可能会遇到许多问题。 我将主要关注一些试图让你展示的东西进行编译,而不深入研究你可能在这里触及的 CUDA 编程的各个方面。
您引用的问题(例如,在类成员变量上使用__device__
)是明确禁止的。
同样不允许使用__managed__
(因为它隐式是__device__
范围的静态分配)。在这样的场景中,您应该使用普通的类成员变量,并根据需要为它们动态分配,也许在构造函数中,也许使用动态托管分配器 (cudaMallocManaged
)。使用指针变量作为类成员变量肯定暗示了这种方法。
您所概述的内容可能还有其他挑战。 例如,__global__
函数可能不是类成员函数。
您可能在 CUDA 编程中有一些相当多的学习要做,但这里仍然是您所展示内容的黑客版本,它没有触及任何明显的问题:
#include <vector>
using namespace std;
// CUDA Acceleration Adapter.
__global__ void evaluate (float *a, float *b, int n, int c) {
for (int i = 0; i < n; i++) a[i]++;
for (int i = 0; i < c; i++) b[i]++;
}
class Accelerator {
public:
float* A;
float* B;
int N;
int C;
Accelerator () {}
Accelerator (int N, int C) {
// initialize variables (unified memory).
this->N = N;
// are "inputs"
this->C = C;
cudaMallocManaged(&A, N*sizeof(float));
cudaMallocManaged(&B, C*sizeof(float));
}
void setData (vector<float>& A, vector<float>& B) {
for (int i=0; i < N; i++) (this->A)[i] = A[i];
for (int i=0; i < C; i++) (this->B)[i] = B[i];
}
void accelerate (vector<float>& results) {
evaluate<<<1,1>>>(A, B, N, C);
cudaDeviceSynchronize();
for (int i = 0; i<N; i++) results[i] = A[i];
}
};
int main () {
Accelerator testAcc(5,3);
}
相关文章:
- 努力将整数转换为链表。不知道我在这里做错了什么
- 我可以在这里替换什么,因为我不能在 C# 中使用隐式变量的 lambda 函数?
- 当我从下面的代码中删除关键字 virtual 时,它可以正常工作,否则会出现错误。在这里"virtual"字的意义是什么?
- File.cpp.o:OpenPose 标志 CMakeFiles/.. 的多重定义/main.cpp.o:首先在这里定
- 为什么thread_local变量在这里从未初始化?
- 为什么我必须在这里使用dynamic_cast
- 在这里,当我们比较 if(vc[i]==vc1[i]) 时,它是向量数组. 实际上比较的值是多少,
- 我正在尝试使用 while 循环从字符串中删除字母,直到没有字母。我在这里做错了什么?
- 为什么 C++20 中的 [[可能]] 属性在这里引发警告?
- 我在这里正确传递参数了吗?
- 为什么gmp会在这里与"invalid next size"重新定位一起崩溃?
- 移动语义在这里如何工作?
- 如何在这里循环运行?
- 为什么枚举变量在这里是右值?
- 我的C++合并排序代码不起作用。我在这里错过了什么?
- 试图美化这个Arduino代码[初学者在这里]
- 复制交换习惯用法-我们可以在这里使用动态强制转换操作吗
- 在这里使用删除运算符是否正确,我很困惑
- 如何使用模板生成整数序列在这里工作
- accelerator.cu(8): 错误:属性"managed"在这里不适用?