我正在尝试使用CUDA的thrust库修改一个简单的动态向量。但是屏幕上显示“launch_closure_by_value”错误,指示错误与某些同步过程有关。
由于此错误,不可能对简单的1D动态数组进行修改。
导致错误的代码片段如下所示。
从.cpp文件中调用setIndexedGrid,该函数在System.cu中定义。
我也在Output窗口(我使用Visual Studio)上看到了以下内容:
由于此错误,不可能对简单的1D动态数组进行修改。
导致错误的代码片段如下所示。
从.cpp文件中调用setIndexedGrid,该函数在System.cu中定义。
float* a= (float*)(malloc(8*sizeof(float)));
a[0]= 0; a[1]= 1; a[2]= 2; a[3]= 3; a[4]= 4; a[5]= 5; a[6]= 6; a[7]= 7;
float* b = (float*)(malloc(8*sizeof(float)));
setIndexedGridInfo(a,b);
System.cu中的代码段:
void
setIndexedGridInfo(float* a, float*b)
{
thrust::device_ptr<float> d_oldData(a);
thrust::device_ptr<float> d_newData(b);
float c = 0.0;
thrust::for_each(
thrust::make_zip_iterator(thrust::make_tuple(d_oldData,d_newData)),
thrust::make_zip_iterator(thrust::make_tuple(d_oldData+8,d_newData+8)),
grid_functor(c));
}
grid_functor在_kernel.cu中定义。
struct grid_functor
{
float a;
__host__ __device__
grid_functor(float grid_Info) : a(grid_Info) {}
template <typename Tuple>
__device__
void operator()(Tuple t)
{
volatile float data = thrust::get<0>(t);
float pos = data + 0.1;
thrust::get<1>(t) = pos;
}
};
我也在Output窗口(我使用Visual Studio)上看到了以下内容:
导致这个问题的原因是什么?在Particles.exe中,地址为0x000007fefdc7cacd处发生了一次C++异常:cudaError_enum,内存地址为0x0029eb60。在smokeParticles.exe中,地址为0x000007fefdc7cacd处发生了一次C++异常:thrust::system::system_error,内存地址为0x0029ecf0。在Particles.exe中,地址为0x000007fefdc7cacd处发生了一次未处理的C++异常:thrust::system::system_error,内存地址为0x0029ecf0。
for_each
调用时犯了一个小的语法错误。看看新版本。我现在已经使用编译器进行了检查,并且在计算1.2设备上使用CUDA 4.1运行良好。 - talonmies