我目前正在尝试将opencl加密货币矿工代码移植到fpga环境。
作为代码的概述,在while循环(检查中止,停止等条件)中,调用内核可用的线程大小(256、1024等),并收集结果(有效的随机数)。
fpga平台(这是一个嵌入式opencl平台)的问题是atomic_inc不存在。 并且它是挖掘代码的重要组成部分。 当内核找到有效的随机数时,将自动增加输出计数器,并将随机数添加到输出缓冲区。 否则(我目前只能在gpus上进行测试,fpga编译需要20-40个小时,几乎不可能进行迭代),多个结果不同步,甚至更糟的是随机数返回0。我们可以简单地说代码已损坏。 / p>
在fpga上下文中,我有两个选择(至少以我目前的知识), 首先将为每个计算单元的缓冲区(并行线程)返回随机数,实现起来不太困难,但我不确定它的效率。
第二个选项,是在随机数发现的那一刻在内核中使用printf。这很难实现,我需要两个不同的进程,一个将包含挖掘线程并由主进程启动,并且其输出(std :: out)需要通过管道传递给主进程(内核中的printf的结果将通过管道传递给main流程)。我不确定opencl上下文中的效率或想法的有效性。
什么是有效的解决方案?
作为相关代码的示例
if ((h7l >> 32) <= Target) {
int i = atomic_inc(output + 0xFF);
output[i] = get_global_id(0);
}
代替上面的内容:
if ((h7l >> 32) <= Target) {
printf("%lX",get_global_id(0));
}