Cuda C中的加法分配运算符
发布时间:2020-12-16 07:02:09 所属栏目:百科 来源:网络整理
导读:我遇到了Cuda C中添加赋值运算符的问题.我收到以下错误: kernel.cu(5): error: expression must have integral or enum type 我的代码是: import pycuda.driver as drvimport pycuda.autoinitfrom pycuda.compiler import SourceModuleimport numpy as npm
我遇到了Cuda C中添加赋值运算符的问题.我收到以下错误:
kernel.cu(5): error: expression must have integral or enum type 我的代码是: import pycuda.driver as drv import pycuda.autoinit from pycuda.compiler import SourceModule import numpy as np mod=SourceModule(""" __global__ void addition(float* a,float* b,float*c){ int i=threadIdx.x + blockIdx.x * blockDim.x; c[a[i]]+=b[i]; } """) addition=mod.get_function("addition") a=np.array([1,2,3,1,1]).astype(np.float32) b=np.array([0.1,0.2,0.1,0.5,0.5]).astype(np.float32) c=np.zeros_like(a) addition(drv.Out(c),drv.In(a),drv.In(b),block=(32,1)) print c 我想要的输出是c = [0,1.1,0.4,0.3,0].有谁能建议解决方案? 解决方法
问题出在你使用A在C中索引的内核中.
A是float类型. 另请注意,您正在启动32个线程,但您只能在8个位置进行索引,这意味着您将索引越界. 您将面临的最后一个问题是,由于a中的重复索引,多个线程会尝试更改C中的相同位置.解决它的一种方法是使用AtomicAdd. __global__ void addition(float * a,float * b,float * c,int n) 以相同的方式启动内核但不要忘记传递a或b的大小.您还可以在启动内核时消除n并更改threadblock维度. (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |