使用CUDA C进行卷积,错误:表达式必须是可修改的左值 \uuuuu全局\uuuuu无效conv(常数浮点*a,常数浮点*a1, 常数大小(单位:n){ //计算此线程应处理的全局元素索引 无符号整数i=threadIdx.x+blockDim.x*blockIdx.x; 无符号整数j=threadIdx.y+blockDim.y*blockIdx.y; //避免访问越界元素 浮点过滤器[9]={-1,-1,-1,9,-1,-1,-1,-1}; if(i

使用CUDA C进行卷积,错误:表达式必须是可修改的左值 \uuuuu全局\uuuuu无效conv(常数浮点*a,常数浮点*a1, 常数大小(单位:n){ //计算此线程应处理的全局元素索引 无符号整数i=threadIdx.x+blockDim.x*blockIdx.x; 无符号整数j=threadIdx.y+blockDim.y*blockIdx.y; //避免访问越界元素 浮点过滤器[9]={-1,-1,-1,9,-1,-1,-1,-1}; if(i,c,cuda,convolution,hpc,C,Cuda,Convolution,Hpc,您已将变量(内核参数)a1标记为const: __global__ void conv(const float *a, const float *a1, const size_t n) { // compute the global element index this thread should process unsigned int i = threadIdx.x + blockDim.x * blockIdx.x; unsigned int

您已将变量(内核参数)
a1
标记为
const

   __global__ void conv(const float *a, const float *a1,
        const size_t n) {
    // compute the global element index this thread should process
    unsigned int i = threadIdx.x + blockDim.x * blockIdx.x;
    unsigned int j = threadIdx.y + blockDim.y * blockIdx.y;
    // avoid accessing out of bounds elements

    float filter[9] = { -1, -1, -1, -1, 9, -1, -1, -1, -1 };
    if (i < n) {
        for (int k = 0; k < 3; k++) {
            printf("%d", filter[k]);
            for (int l = 0; l < 3; l++) {
                //printf("%d",a[((i-1) + k)*n + (j+1-l)]);
                a1[i*n + j] = a[(i-1 + k)*n + (j+1-l)]*filter[k*3 + l];
                printf("%d", a[i]);
            }
        }
    }

}
如果这样做,则无法修改内核中a1指向的值:

__global__ void conv(const float *a, const float *a1,
                                     ^^^^^        ^^

如果要修改内核中由
a1
引用的任何内容,请从参数列表中删除
const

您的问题是什么?您没有提出问题。谢谢,这就是问题所在
 a1[i*n + j] = a[(i-1 + k)*n + (j+1-l)]*filter[k*3 + l];
 ^^