从结构启动 Cuda 调用
Launching Cuda Call from struct
给定一个简单的结构来包装 cuda 代码,可以写出类似的东西
func<float> s;
s.val = 3.f;
start_correct<<<1, 2>>>(s);
但是,我想将块、网格、共享内存计算放入结构中并调用内核,例如
func<float> s;
s.val = 3.f;
s.launch();
当第一个工作时,第二个给了我一个非法的内存访问错误。
重现我的问题的一个最小示例是
#include <stdio.h>
template<typename T>
struct func;
template<typename T>
__global__ void start(const func<T>& s){
printf("host access val %f n",s.val);
s();
}
template<typename T>
struct func
{
T val;
__device__ void operator()() const{
printf("device access val %f [%d]n",val,threadIdx.x);
}
enum{ C_N = 2 };
void launch()
{
start<<<1, C_N>>>(*this);
}
};
template<typename T>
__global__ void start_correct(const func<T> s){
printf("host access val %f n", s.val);
s();
}
int main(int argc, char const *argv[])
{
cudaError_t err;
func<float> s;
s.val = 3.f;
// launch cuda kernel <-- WORKS
start_correct<<<1, 2>>>(s);
cudaDeviceSynchronize();
if (err != cudaSuccess) printf("Error: %sn", cudaGetErrorString(err));
// launch cuda kernel <-- DOES NOT WORK
s.launch();
cudaDeviceSynchronize();
err = cudaGetLastError();
if (err != cudaSuccess) printf("Error: %sn", cudaGetErrorString(err));
return 0;
}
输出为
host access val 3.000000
host access val 3.000000
device access val 3.000000 [0]
device access val 3.000000 [1]
host access val 0.000000
host access val 0.000000
device access val 0.000000 [0]
device access val 0.000000 [1]
Error: an illegal memory access was encountered
两种方式不应该是等价的吗?是否有任何替代方案,也可以在结构内部进行shm,网格计算?
除非使用的是托管内存(不是),否则通过引用传递内核参数是不合法的:
__global__ void start(const func<T>& s){
^
当我删除该与号时,您的代码运行时没有任何运行时错误,并给出了合理的输出:
$ cuda-memcheck ./t355
========= CUDA-MEMCHECK
host access val 3.000000
host access val 3.000000
device access val 3.000000 [0]
device access val 3.000000 [1]
host access val 3.000000
host access val 3.000000
device access val 3.000000 [0]
device access val 3.000000 [1]
========= ERROR SUMMARY: 0 errors
$
请注意,这实际上没有意义:
cudaDeviceSynchronize();
if (err != cudaSuccess) printf("Error: %sn", cudaGetErrorString(err));
并为我抛出编译器警告。
也许你的意思是:
err = cudaDeviceSynchronize();
if (err != cudaSuccess) printf("Error: %sn", cudaGetErrorString(err));
相关文章:
- 如何用g++从OpenACC C++代码中调用cuda库
- 编译为 cuda 内核调用提供了"expression must have integral or unscoped enum type"
- 从结构启动 Cuda 调用
- CudaError未知代码= 30在任何cuda调用上
- 是否可以从 CUDA 10.1 内核调用 cuBLAS 或 cuBLASLt 函数?
- 推力(cuda)错误:无法使用给定参数列表调用函数
- 验证调用 cuda 内核的次数
- cuda 内核调用/传递参数中的编译错误
- 在 CUDA 中,Nsight 不会在时间轴中显示 cuInit(0) 调用
- CUDA OPENCV CVTCOLOR调用不会将图像转换为不同的格式
- 通过复制将对象传递给 CUDA 内核会调用其析构函数并过早释放内存
- 调用 Cuda/推力中所有组合的函子
- 为什么调用 CUDA 内核函数时这个类成员变量没有改变
- 用嵌套调用CUDA :: thrust functors作为zip_iterator操作的函数
- 不支持外部调用 - CUDA
- 调用 CUDA 编译.dll从 R - .C 与 .叫
- 为什么我调用CUDA数学库sqrt()函数失败
- 调用cuda内核时的性能损失
- 从包含相同头文件的其他.cpp文件调用CUDA函数
- 如果不能在条件分支中调用 CUDA,如何在 CUDA 中减少__syncthreads?