Кэш делается под GPU
Сейчас кеш сделан под тупо сохранение микрокода RSX в неизменном виде.
Добавлено позже:Мне не ясно почему они ни какие операции карте не отдают.
Потому же почему нельзя заменить карьерный самосвал спорткаром. И наоборот.
CPU и GPU это два разных по своей идеологии вычислительных устройства и то что хорошо работает на одном не всегда будет хорошо работать на другом.
GPU - заточен под однотипную обработку больших масивов данных, с результатом в виде большого массива данных. Если нет массива данных, то и нет смысла перекладывать это на GPU. Далее, GPU достаточно тяжело переносит операции ветвления, из-за своей параллельной архитектуры (не забываем, что "потоки" в терминах GPU - это именно потоки входных данных, а не потоки выполнения независимых программ, как у CPU). И если у нас есть условие
if(a>b){
do_something
}else{
do_another
}
То на GPU будут выполнены ОБЕ ветки условия, потому что в обрабатываемом массиве не одна пара переменных a и b, а несколько. И ГПУ будет работать так, проверит для каждой пары во входном массиве условие, "выключит" те потоки где это условие ложно, выполнит алгоритм для оставшихся "включенными" потоков, затем включит выключенные, выключит включенные и выполнит вторую ветку условий.
Из этого же вытекает следующее - GPU крайне так же хреново выполняет алгоритмы типа Reduce (свертки данных, когда у нас на входе много чисел а на выходе - одно), поскольку его "потоки данных" ничего не знают друг о друге и именно в связи с этим ограничением у GPU и такие цифры производительности в гигафлопсах, по сравнению с CPU.
То бишь задача GPU - выполнение относительно несложных алгоритмов над большими объемами однотиных данных. При несоблюдении всех условий (сложность алгоритма, малые объемы данных, выполнение "горизонтальных операций" между соседними элементами этих самых массивов данных) от GPU толку не будет.
То есть если у нас массив {a1,a2,a3,a4,a5,...an} и нам нужно сложить все элементы массива - то не покатит.
Если у нас два массива {a1,a2,a3,a4,a5,...an} и {b1,b2,b3,b4,b5,...an} и нам нужно на выходе получить массив {a1+b1,a2+b2,a3+b3,a4+b4,a5+b5,...an+bn} - то отлично, данная задача подходит для выполнения на GPU и теперь вопрос в количестве n, если оно мало (меньше общего количества нитей GPU), то его выгоднее выполнить на CPU, потмоу что затраты на установку задачи и на команды получения результата GPU будут больше чем время её выполнения.
С условиями - если алгоритм содержит много операторов if и условие в этих операторах зависят от отдельных элементов массивов данных - то алгоритм будет выполняться медленно, и огромное количество поотоков тут не поможет. Если в условии - какая либо глобальная константа (uniform -переменная в терминах OpenGL), одинаковая для всех потоков - то тут проигрыша в производительности не будет, поскольку условие одинаково для всех потоков и другие ветки выполняться не будут.