gpt4 book ai didi

c++ - 推力转换抛出错误 : "bulk_kernel_by_value: an illegal memory access was encountered"

转载 作者:行者123 更新时间:2023-11-30 01:12:02 25 4
gpt4 key购买 nike

我是 CUDA/Thrust 的新手,对代码片段有疑问。为了方便起见,我将其削减到最低限度。代码如下:

struct functor{
functor(float (*g)(const float&)) : _g{g} {}

__host__ __device__ float operator()(const float& x) const {
return _g(x);
}
private:
float (*_g)(const float&);
};

__host__ __device__ float g(const float& x){return 3*x;}

int main(void){
thrust::device_vector<float> X(4,1);
thrust::transform(X.begin(), X.end(), X.begin(), functor(&g));
}

我的想法是我可以将任何函数传递给仿函数,这样我就可以将该函数应用于 Vector 中的每个元素。不幸的是,我不确定为什么会出现上述错误。我用 -w -O3 -shared -arch=sm_20 -std=c++11 -DTHRUST_DEBUG

编译

我很感谢你们能给我的任何帮助:)

最佳答案

__device__ 函数(或__host__ __device__)的地址不能在主机代码中获取,以便在设备上使用:

thrust::transform(X.begin(), X.end(), X.begin(), functor(&g));
^
You will not get the
__device__ function
address here

stackoverflow 上有很多问题讨论了通过内核调用传递的 CUDA 设备函数地址的用法。 This answer 几个可能感兴趣的链接。

解决此问题的一种可能方法是获取设备代码中的设备功能地址,并将其传递给主机,以便像您描述的那样使用:

$ cat t1057.cu
#include <thrust/device_vector.h>
#include <thrust/transform.h>
#include <thrust/copy.h>
#include <iostream>
struct functor{
functor(float (*g)(const float&)) : _g{g} {}

__host__ __device__ float operator()(const float& x) const {
return _g(x);
}
private:
float (*_g)(const float&);
};

__host__ __device__ float g(const float& x){return 3*x;}

__device__ float (*d_g)(const float&) = g;

int main(void){
float (*h_g)(const float&) = NULL;
cudaMemcpyFromSymbol(&h_g, d_g, sizeof(void *));
thrust::device_vector<float> X(4,1);
thrust::transform(X.begin(), X.end(), X.begin(), functor(h_g));
thrust::copy_n(X.begin(), X.size(), std::ostream_iterator<float>(std::cout, ","));
std::cout << std::endl;
}
$ nvcc -o t1057 t1057.cu -std=c++11
$ ./t1057
3,3,3,3,
$

另一种可能的方法,利用@m.s 始终聪明的工作。 here使用模板:

$ cat t1057.cu
#include <thrust/device_vector.h>
#include <thrust/transform.h>
#include <thrust/copy.h>
#include <iostream>

typedef float(*fptr_t)(const float&);

template <fptr_t F>
struct functor{

__host__ __device__ float operator()(const float& x) const {
return F(x);
}
};

__host__ __device__ float g(const float& x){return 3*x;}


int main(void){
thrust::device_vector<float> X(4,1);
thrust::transform(X.begin(), X.end(), X.begin(), functor<g>());
thrust::copy_n(X.begin(), X.size(), std::ostream_iterator<float>(std::cout, ","));
std::cout << std::endl;
}
$ nvcc -o t1057 t1057.cu -std=c++11
$ ./t1057
3,3,3,3,
$

关于c++ - 推力转换抛出错误 : "bulk_kernel_by_value: an illegal memory access was encountered",我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34879789/

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