早上好,
我是cuda / pyCuda的新手,所以可能会有一个简单的解决方案,采用一些我不知道的机制....
我正在使用pycuda来操作值对:我从最大值中减去最小值,然后执行一些耗时的操作。因为它必须重复多次,所以非常适合GPU。
然而,大多数情况下减法的结果是相同的。然后,执行耗时的操作毫无意义。我在我的代码的非GPU版本中做的是:
myFunction(A,B):
index=A-B
try:
value = myDictionary[index]
except:
value = expensiveOperation(index)
myDictionary[index] = value
return value
由于访问字典要比昂贵的操作快得多,并且大多数时候都能找到这个值,所以我获得了显着的时间收益。
将其移植到GPU时,我可以调用具有高度并行性的myFunction(A,B),这很棒。但是,我不知道如何使用这种字典机制 - 或类似的机制 - 以避免冗余操作。
对此有何想法?
感谢您的帮助
编辑:我想知道,是否可以将字典存储在GPU上,还是应该每次都复制它?如果它在GPU上,是否可以同时由多个内核访问/编辑?我该如何实施呢?
答案 0 :(得分:1)
你可以试试这个:
myFunction(A,B):
index=A-B
if index in myDictionary.keys():
value = myDictionary[index]
else:
value = expensiveOperation(index)
myDictionary[index] = value
return value
答案 1 :(得分:0)
看来你的问题是在GPU代码中实现某种记忆功能。我认为这不值得追求。在GPU算术运算几乎是免费的,但内存访问非常昂贵(而且随机内存访问更是如此)。在GPU内存中执行字典/哈希表查找以从缓存中检索算术结果几乎可以保证比仅计算结果的成本慢。这听起来反直觉,但这是GPU计算的现实。
在像Python这样相对较慢的解释语言中,使用快速本机memoisation mechanism很有意义,并且记住完整内核函数调用的结果也可以为昂贵的内核带来有用的性能优势。但是CUDA中的记忆似乎并不那么有用。