2015-07-11 2 views
4

J'ai besoin d'une double précision pour certains calculs GPGPU utilisant DirectCompute. Quand je fais tout flotter, le shader compile et fonctionne très bien. Cependant, quand j'essaye d'employer des doubles n'importe où dans mon shader, il compilera, mais appelant ID3D11Device::CreateComputeShader() à l'exécution échoue avec E_INVALIDARG. Le code du côté C++ est exactement le même, attention, je viens de changer quelques variables dans le shader pour doubler. Quand j'appelle ID3D11Device::CheckFeatureSupport() avec D3D11_FEATURE_DOUBLES, il signale que les doubles sont supportés sur mon adaptateur, qui est un AMD Radeon R9 270x. D'après quelques recherches sur Google, les cartes AMD sont très efficaces pour les calculs en double précision - IE, ma carte peut utiliser des doubles, mais DirectX ne semble pas vouloir me laisser faire ça. Je pensais que peut-être DirectCompute n'avait pas cette capacité (ce qui serait bizarre, puisque beaucoup de processus scientifiques GPGPU ont besoin de doubles), alors j'ai essayé d'utiliser un pixel shader à la place. La même chose arrive.CreateComputeShader renvoie E_INVALIDARG lors de l'utilisation de doubles

Est-ce un bug de pilote, ou y a-t-il quelque chose qui me manque?

EDIT: Je viens de chercher le dernier pilote Catalyst, et apparemment je suis derrière quelques versions. C'est intéressant, étant donné que je suis allé au centre de contrôle et vérifié les mises à jour plusieurs fois récemment. Je vais mettre à jour et voir ce qui se passe.

EDIT2: La mise à jour n'a eu aucun effet. Soit je fais quelque chose de mal, ou DirectX a un bug de toutes sortes.

+0

Quel niveau caractéristique avez-vous créé votre appareil à? –

+0

@AdamMiles Je lui ai passé nullptr pour les niveaux de fonctionnalités afin qu'il soit par défaut à tout ce qui est disponible – NmdMystery

+0

@AdamMiles Cependant, il doit utiliser la version 11.0, car 11.1 ne fonctionne pas sur mon environnement. – NmdMystery

Répondre

2

Le modèle de shader double précision de base support 5,0 comme indiqué par D3D11_FEATURE_DOUBLES ne comprend que le soutien pour les opérations suivantes:

  • dadd - Ajout/Négation/Soustraction
  • deq, dge, dlt, dne - Comparaison
  • dmax - Max
  • dmin - Min
  • dmov, dmovc - Moves
  • dmul - Multiplier
  • dtof, ftod - double conversion < -> flotteur

Vous devez vérifier D3D11_FEATURE_DATA_D3D11_OPTIONS.ExtendedDoublesShaderInstructions qui inclut tous ceux ci-dessus plus:

  • dfma - Fused multiplier-ajouter
  • ddiv - Division
  • drcp - réciproque

Shader Model 5 Assembly

RE: DirectX 11,1

D3D11_FEATURE_DATA_D3D11_OPTIONS.ExtendedDoublesShaderInstructions fait partie de l'API DirectX 11.1 et est une fonctionnalité matérielle qui nécessite WDDM 1.2 pilotes .Par conséquent, selon MSDN, même avec le runtime DirectX 11.1 installé sur Windows 7 via KB2670838 cette fonctionnalité matérielle nécessite Windows 8 ou version ultérieure pour être vrai.

DirectX 11.1 and Windows 7 Update
DirectX 11.1 and Windows 7

+0

J'ai sélectionné ceci comme réponse correcte, car c'est probablement la réponse dans la plupart des cas, mais je n'ai pas dfma, ddiv ou drcp dans mon code. Je multiplie un double par un uint, cependant, et me débarrasser de cette ligne permet au shader d'être lié. – NmdMystery

+0

Regardez l'assembly généré par le compilateur HLSL pour les shaders échoués pour ces instructions. Plus que probablement, votre shader a été optimisé pour utiliser les instructions supplémentaires. Idéalement, il y aurait un moyen d'empêcher le compilateur HLSL de les utiliser, mais je ne vois pas un tel changement dans l'outil. –

+0

Cela s'est avéré être. Comme il n'y a pas d'assemblage en ligne dans HLSL, DirectCompute est trop lourd pour ce type de projet. J'ai essayé d'utiliser des doubles dans OpenCL, et il semble les autoriser sans discernement. – NmdMystery