OpenCL大数乘法

OpenCL大数乘法,c,opencl,gpu,gpgpu,C,Opencl,Gpu,Gpgpu,这些天我抱怨OpenCL太多了。我在那里寻找大数乘法函数(不是矩阵乘法),并使一些工作很好,但我也有失败。我有几个这样的问题 首先,对于两个整数数组(表示100000位这样的大数字),最好的乘法算法是什么。我确实有点喜欢学校等级制度和矩阵乘法(交叉线加法)。我已经检查了Karatsuba和ToomBook,但是我看到它们是递归的,OpenCL内部不允许这样做。我是真的这么做了,还是有那么简单的事情 我已经多次寻找运行内核,因为我的gpu在超过512位时不能正常工作。这看起来像是一个local\

这些天我抱怨OpenCL太多了。我在那里寻找大数乘法函数(不是矩阵乘法),并使一些工作很好,但我也有失败。我有几个这样的问题

  • 首先,对于两个整数数组(表示100000位这样的大数字),最好的乘法算法是什么。我确实有点喜欢学校等级制度和矩阵乘法(交叉线加法)。我已经检查了Karatsuba和ToomBook,但是我看到它们是递归的,
    OpenCL
    内部不允许这样做。我是真的这么做了,还是有那么简单的事情

  • 我已经多次寻找运行内核,因为我的gpu在超过512位时不能正常工作。这看起来像是一个
    local\u work\u size
    问题,但当我在NDKernel上尝试全局(1024)和本地(512)输入时,它也不起作用。(无效的工作大小错误)我的mac上有两个GPU,分别是Iris pro和R9M370X。AMD的一个是相当有效的,但现在过剩的情况仍然是一个问题

  • 使用屏障(全局)在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只有工作组同步,没有全局同步。一些工作组将在其他工作组开始之前完全完成。除了将多个内核排队外,没有全局同步机制。