Комментировать

Сейчас наверное уже нет особого смысла

Сейчас наверное уже нет особого смысла вспоминать, после выхода новых версий SDK.
Например, вот этот кернел
kernel void subtractionBug(int a<>, out int c<>, out int d<>)
{ int constant_c = 4194304;
int constant_d = 4194305;
c = a - constant_c;
d = a - constant_d;
}
неверно исполнялся на гпу: 24бит числа (а точнее, числа =< 400000h) вычитались корректно, а вот с большими числами (т.е.
начиная с 400001h) начинались
проблемы.
Сейчас, кстати, проверил как он компилится через Stream KernelAnalyzer:

; -------- Disassembly --------------------
00 TEX: ADDR(48) CNT(1) VALID_PIX
0 SAMPLE R0.x___, R0.xyxx, t0, s0 UNNORM(XYZW)
01 ALU: ADDR(32) CNT(13)
1 x: ADD_INT R0.x, (0xFFC00000, -1.#INDf).x, R0.x
y: MOV R0.y, 0.0f
z: ADD_INT R0.z, (0xFFBFFFFF, -1.#QNANf).y, R0.x
w: MOV R0.w, 0.0f
2 x: MOV R2.x, PV1.z
y: MOV R2.y, PV1.w
z: MOV R2.z, PV1.w
w: MOV R2.w, PV1.w
3 x: MOV R1.x, R0.x
y: MOV R1.y, R0.y
z: MOV R1.z, R0.y
w: MOV R1.w, R0.y
02 EXP_DONE: PIX0, R1 BRSTCNT(1)
END_OF_PROGRAM
"проблемная" инструкция по каналу z, вроде все нормально.
В IL компилит тоже без особых патологий:
"dcl_literal l12, 0x00400000, 0x00400000, 0x00400000, 0x00400000"
"dcl_literal l13, 0x00400001, 0x00400001, 0x00400001, 0x00400001"
.
.
.
"mov r272.x___, l12.x000"
"mov r273.x___, l13.x000"
"iadd r274.x___, r269.x000, r272.x000_neg(xyzw)"
.
"iadd r275.x___, r269.x000, r273.x000_neg(xyzw)"