gpt4 book ai didi

OpenCL 矩阵向量乘法代码每次运行都会给出正确和错误的解决方案

转载 作者:行者123 更新时间:2023-12-02 06:52:58 33 4
gpt4 key购买 nike

我正在研究用于稀疏矩阵运算的 OpenCL 代码,我发现当包括内核的代码执行一次或两次时它可以工作。但每隔几次运行,答案就会略有偏差。这是我正在使用的非常简单的内核:

__kernel void dsmv( int N, __global int * IA,
__global int * JA, __global float * A,
__global float * X, __global float * Y){

int IBGN, ICOL, IEND, ii;
ICOL = get_global_id(0);

if(ICOL < N)
{
IBGN = JA[ICOL]-1;
IEND = JA[ICOL+1]-1-1;

for (ii = IBGN; ii <= IEND; ii++)
{
Y[IA[ii]-1] += A[ii]*X[ICOL];
}
}
}

我还可以发布使用该内核的 fortran 代码。我正在使用 FortranCL。

什么可能导致乘法每次运行给出不同的答案?

最佳答案

这一行看起来很可疑:

Y[IA[ii]-1] +=  A[ii]*X[ICOL];

似乎两个工作项可能会增加相同的内存位置,因此这里存在潜在的竞争条件,并且由于 += 不是原子操作,这是一个问题。

不幸的是,您不能使用内置的 atomic_add 来代替,因为它不支持 float ,但 atomic_cmpxchg 支持,因此您可以使用它来实现 float -点原子添加 - 或只是 look at this existing implementation of an atomic add for floats .

关于OpenCL 矩阵向量乘法代码每次运行都会给出正确和错误的解决方案,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13204176/

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