Cuda C中的加法分配运算符

我遇到了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)
{
int i = threadIdx.x blockIdx.x * blockDim.x;
if(i< n)
atomicAdd(和C [(int)的A [1],B [1]);
}

以相同的方式启动内核但不要忘记传递a或b的大小.您还可以在启动内核时消除n并更改threadblock维度.

相关文章

本程序的编译和运行环境如下(如果有运行方面的问题欢迎在评...
水了一学期的院选修,万万没想到期末考试还有比较硬核的编程...
补充一下,先前文章末尾给出的下载链接的完整代码含有部分C&...
思路如标题所说采用模N取余法,难点是这个除法过程如何实现。...
本篇博客有更新!!!更新后效果图如下: 文章末尾的完整代码...
刚开始学习模块化程序设计时,估计大家都被形参和实参搞迷糊...