gpt4 book ai didi

c - OpenCL 一维数组大数乘法

转载 作者:行者123 更新时间:2023-11-30 16:43:57 25 4
gpt4 key购买 nike

我正在研究将两个整数数组相乘以获得大数字。我基本上乘以大约 20 位数字,但对于更多数字,它表现不稳定。我有一些关于 CPU 和内核的代码用于测试,每次工作后内核都会给我不同的数字。问题可能是屏障或互斥锁之类的东西,但我对此不太感兴趣。我怎样才能解决这个不稳定的问题呢?这是代码

kernel void multiply(global int* A,
const int M,
global int* B,
const int N,
global int* C){
const int globalRow = get_global_id(0); // Row ID of C (0..M)
int globalCol,i;

// Compute a single element (loop over K)
for (globalCol=0; globalCol<N; globalCol++) {
int val=A[globalRow]*B[globalCol];

printf("Row is %d , Col is %d \n",globalRow,globalCol);
//C[globalCol + globalRow +1]+=val/10;
C[globalCol + globalRow]+=val%10;

C[globalCol+1+globalRow]+=val/10;

}

int flag=1;
while (flag) {
flag=0;
for (i=M+N-1 ; i>=0 ; i--) {
if (C[i]>9) {
C[i+1]+=C[i]/10;
C[i]=C[i]%10;
flag=1;
}
}
}

}

代码上的标志正在发生变化。听起来像是访问元素问题,但我不知道如何解决。

最佳答案

你有竞争条件。相邻线程在对 C 数组执行 += 的两行代码中同时访问同一内存位置。由于它们遵循特定的模式,因此您可以在两个 += 操作之间使用 barrier(CLK_GLOBAL_MEM_FENCE) 来消除竞争条件。我认为下面的进位代码中有类似的内容。请小心,因为工作组中的所有线程都必须遇到障碍,否则您的内核将挂起或崩溃。

关于c - OpenCL 一维数组大数乘法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44859044/

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