OpenCL大数乘法
这些天我抱怨OpenCL太多了。我在那里寻找大数乘法函数(不是矩阵乘法),并使一些工作很好,但我也有失败。我有几个这样的问题OpenCL大数乘法,c,opencl,gpu,gpgpu,C,Opencl,Gpu,Gpgpu,这些天我抱怨OpenCL太多了。我在那里寻找大数乘法函数(不是矩阵乘法),并使一些工作很好,但我也有失败。我有几个这样的问题 首先,对于两个整数数组(表示100000位这样的大数字),最好的乘法算法是什么。我确实有点喜欢学校等级制度和矩阵乘法(交叉线加法)。我已经检查了Karatsuba和ToomBook,但是我看到它们是递归的,OpenCL内部不允许这样做。我是真的这么做了,还是有那么简单的事情 我已经多次寻找运行内核,因为我的gpu在超过512位时不能正常工作。这看起来像是一个local\
- 首先,对于两个整数数组(表示100000位这样的大数字),最好的乘法算法是什么。我确实有点喜欢学校等级制度和矩阵乘法(交叉线加法)。我已经检查了Karatsuba和ToomBook,但是我看到它们是递归的,
内部不允许这样做。我是真的这么做了,还是有那么简单的事情OpenCL
- 我已经多次寻找运行内核,因为我的gpu在超过512位时不能正常工作。这看起来像是一个
问题,但当我在NDKernel上尝试全局(1024)和本地(512)输入时,它也不起作用。(无效的工作大小错误)我的mac上有两个GPU,分别是Iris pro和R9M370X。AMD的一个是相当有效的,但现在过剩的情况仍然是一个问题local\u work\u size
- 使用屏障(全局)在512位之后也不起作用。我想除了这个没有什么好主意。若我使用2048全局大小和256本地大小,那个么内核应该可以在8个工作组中使用256本地大小。我试过使用局部屏障和全局屏障(这两种屏障都有效),但都不起作用。在512位(或1024位不移位-只需添加矩阵的交叉线-)之后,它给出不同的值
- 最后一个问题是,我应该将长数组划分为小数组,并使用异构内核。我的意思是在for循环中,将参数作为一个小片段给出
int*a
和int*B
)发送到内核,这是一个缺点
我希望我能解释我的情况。谢谢你的帮助
kernel void multiply(global int* A,
const int M,
global int* B,
const int N,
global int* C) {
//const int row = get_local_id(0); // Row ID of C (0..M)
const int globalRow = get_global_id(0);
uint globalCol;
int i;
for(i=0;i<M+N+1;i++) {
C[i]=0;
}
for (globalCol=0; globalCol<N; globalCol++) {
int val=A[globalRow]*B[globalCol];
C[globalCol + globalRow +1]+=val/10;
//barrier(CLK_GLOBAL_MEM_FENCE);
C[globalCol + globalRow]+=val%10;
barrier(CLK_GLOBAL_MEM_FENCE);
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) {
barrier(CLK_GLOBAL_MEM_FENCE);
C[i+1]+=C[i]/10;
barrier(CLK_GLOBAL_MEM_FENCE);
C[i]=C[i]%10;
//barrier(CLK_GLOBAL_MEM_FENCE);
flag=1;
}
}
}
}
内核空乘(全局int*A,
常量int M,
全局整数*B,
const int N,
全局整数*C){
//const int row=get_local_id(0);//C(0..M)的行id
const int globalRow=get_global_id(0);
uint-globalCol;
int i;
对于(i=0;i9){
屏障(CLK_GLOBAL_MEM_围栏);
C[i+1]+=C[i]/10;
屏障(CLK_GLOBAL_MEM_围栏);
C[i]=C[i]%10;
//屏障(CLK_GLOBAL_MEM_围栏);
flag=1;
}
}
}
}
(我尝试了哪些障碍有效)至于第一个问题,答案取决于渐进“更快”算法的回报阈值。如果整数足够大,将是最好的。谷歌搜索显示了相当多的GPGPU实现结果。@BrettHale阈值是数千位,不管怎样,FFT看起来不错,实际上我现在正在看这个。谢谢。请理解OpenCL只有工作组同步,没有全局同步。一些工作组将在其他工作组开始之前完全完成。除了将多个内核排队外,没有全局同步机制。