我有一个程序(不是我的 - 从i-net下载)在ATI流上制作(更准确 - 在brook lang - 文件是* .br)。有一个python脚本(见下文),它使用由ATI流SDK提供的brook编译器将其编译为* .il文件。脚本将其拉入* .Z文件后。 C程序的Makefile包含此代码
my_kernel_dp11.o: my_kernel_dp11.Z
ld -s -r -o my_kernel_dp11.o -b binary my_kernel_dp11.Z
然后它链接到主执行文件。 来自该obj文件的数据由C程序读入一些缓冲区然后称为 calclCompile 函数(据我所知它是OpenCL函数)。 它在AMD HD 6970系列上运行良好,但在AMD HD 7970系列上失败并出现以下错误
在后端检测到不支持的程序构造
这是一个python脚本
#!/usr/bin/python
import sys
import zlib
import os
def makebrz(dp_bits):
try:
os.unlink("a_slice_dpX_a_slicer.il")
except OSError:
pass
dpdefs=""
for i in range(dp_bits-11):
dpdefs = dpdefs + " -D DP_BIT_%i" % (i+12,)
print "DP_DEFS: ", dpdefs
os.system("/usr/local/atibrook/sdk/bin/brcc -k -pp %s a_slice_dpX.br" % (dpdefs,) )
f = open("a_slice_dpX_a_slicer.il")
if f==None:
print "Could not read ", sys.argv[1]
sys.exit(-1)
data = f.read()
f.close()
oname = "../my_kernel_dp%i.Z" % (dp_bits,)
data2 = zlib.compress(data)
fo = open( oname, "wb" )
fo.write(data2)
fo.close()
#os.system("ld -s -r -o ../%s.o -b binary %s" % (oname[:-2],oname))
makebrz(11)
makebrz(12)
makebrz(13)
makebrz(14)
这是一个程序http://dl.dropbox.com/u/46469564/a_slice_dpX.br
问题是:我应该怎样做才能使程序“受支持”? 附:有一个问题 - 我根本不知道这项技术(布鲁克,ATI流,OpenCL)。这就是为什么“你应该尝试这个或那个”这样的建议是没用的。我需要采取特别行动 - 改变这一点,你就会成功:) 谢谢。
答案 0 :(得分:1)
AFAIK Radeon HD7970基于GCN架构,所以如果你使用brook来生成IL代码,南岛的JIT可能不知道如何为你正在使用的h / w生成适当的ISA,所以如果你想继续使用brook +然后你需要等到更新版本的Brook +在sourceforge上发布,它可以生成一个转换为正确的ISA(GCN)的IL。
其他选项是使用AMD APP SDK 2.6并在OpenCL中重写代码。