In 16.1 verhielt sich dieser Code wie erwartet, wo die äußere Schleife aufgrund von Abhängigkeiten serialisiert wurde und die innerlichen Schleife-Abhängigkeiten vom #pragma ivdep entfernt wurden.
Diese Schleife wird aufgrund wahrer Abhängigkeiten mit innerer Schleife serialisiert
für (nicht vorzeichenloses Zeichen x = 0; x < 4; x) {
Innere Schleife hat keine Inter-Iterations-Abhängigkeiten, hängt aber von der äußeren Schleife ab
#pragma-Signalton
für (nichtsigniertes Zeichen y = 0; y<64; y) {
In 17.0 wird der #pragma ivdep jetzt sowohl auf die innere als auch auf die äußere Schleife angewendet, sodass die Abhängigkeiten in der äußeren Schleife nicht vom Compiler berücksichtigt werden. In der Folge funktioniert ähnlicher Code in der Hardware möglicherweise nicht korrekt, obwohl er in der Emulation funktioniert.
Problemumgehung:
1. Fügen Sie dem Kernel ein zusätzliches Argument "Dummy" hinzu. Auf Der Host-Seite übergeben Sie für dieses Dummy-Argument immer 1.
BEVOR
__kernel ungültiger my_kernel(
__global cpx_t* die Eingabe beschränken,
__global cpx_t* Das Ergebnis beschränken)
NACH
__kernel ungültiger my_kernel(
__global cpx_t* die Eingabe beschränken,
__global cpx_t* das Ergebnis beschränken,
int Dummy)
2. Wickeln Sie die innere Schleife in das "If (Dummy)" ein:
Diese Schleife wird aufgrund wahrer Abhängigkeiten serialisiert
für (nicht vorzeichenloses Zeichen x = 0; x < 4; x) {
wenn (Dummy) {
Keine Abhängigkeiten innerhalb jedes Satzes von 64 Iterationen
#pragma-Signalton
für (nichtsigniertes Zeichen y = 0; y<64; y) {
Dieses Problem wird voraussichtlich in einer zukünftigen Version der Intel© OpenCL™ für FPGA SDK behoben.