2010-08-21 2 views
5

J'ai délibéré sans cesse sur quel langage/cadre convient le mieux. J'ai besoin de développer un framework HPC. Tout le traitement sera complètement OO. Il passera les objets entre les instances (externe) et en interne entre les threads & moteurs. Les objets seront une extension de Active Messages.Quel langage/framework pour HPC: Java/.Net/Delphi/C/C++/Objective-C?

Ces instances peuvent fonctionner sur mobile, Windows, Mac, Linux, etc.

Le système doit être en mesure d'effectuer le calcul hautement parallèle avec une efficacité vitesse &, idéalement prendre avantage de l'ESS, et idéalement support CUDA/OpenCL.

J'ai examiné les éléments suivants:

Java - il est gourmand en mémoire et ne fonctionne pas sur Mac (non officiellement, de toute façon)
.Net - mémoire faim; limité dans la portée de la plateforme; non SSE natif
Delphi - pas 64 bits; Portée de la plate-forme limitée
C/C++ - non directement pris en charge par Mac; complexe à coder; Cependant, il est omniprésent
Objective-C - pris en charge par Mac; semble être pris en charge ailleurs; fonctionne en passant des messages, ce qui est conforme à mes exigences de conception; Ne sait pas beaucoup à ce sujet

Des suggestions?

+1

Java fonctionne sur Mac check http://developer.apple.com/java/faq/ – YoK

+0

C et C++ sont absolument pris en charge par Mac. À quoi pensez-vous que Mac OS est écrit? – Joe

+0

"Passer des messages" == "méthodes d'appel". Absolument pas différent. – Joe

Répondre

5

Voici ma course vers le bas de certaines options (sans ordre particulier):

C/C++

Si tout ce que vous aimez est la performance (et rien autre), ceux-ci fourniront. L'accès direct aux constructions au niveau du système, telles que l'affinité du processeur et l'assemblage en ligne, peut certainement avoir un impact sur les performances. Cependant il y a 2 inconvénients principaux à l'option C/C++. Premièrement, ni un modèle de mémoire bien défini, donc le modèle de mémoire que vous développez est celui du processeur sur lequel vous exécutez le système (si vous ne savez pas quel modèle de mémoire est appliqué à la programmation simultanée, alors vous devriez ne le fais pas). Cela vous relie très étroitement à une plate-forme unique. Le second est l'absence d'un garbage collector, la gestion manuelle de la mémoire est délicate (mais faisable) dans les cas simples, avec C++ un certain nombre d'utilitaires de support simplifient le problème (par exemple pointeurs automatiques/pointeurs intelligents). Lors de l'écriture de code concurrent, il est plus difficile de définir un ordre de grandeur car les règles pour la libération d'un certain morceau de mémoire deviennent très difficiles à définir. Par exemple. quand un objet est passé sur un fil différent, qui est responsable de le relâcher? Si vous utilisez C++, il est important de vous assurer que vous utilisez des versions thread-safe des classes utilisées pour gérer la mémoire. Par exemple. le pointeur intelligent de suralimentation ne prend en charge que l'utilisation des méthodes déclarées comme "const" sur différents threads (par exemple, le déréférencement est OK), cependant les méthodes non-const (par exemple affectation) ne sont pas thread-safe.

Java

Java serait ma recommandation, il a l'appui sur toutes les plateformes que vous avez mentionnés (y compris mobile, Android et JavaME par exemple), ainsi que CUDA support. Java a un modèle de mémoire bien défini qui est cohérent à travers les plates-formes, un JIT et un optimiseur robustes et matures, et un nombre de garbage collector bien et améliorant. La plupart des applications à usage général écrites en Java fonctionneront aussi vite que leurs homologues en C/C++. Bien qu'il s'agisse d'un peu de mémoire, si vous faites du travail HPC, vous allez probablement jeter un peu de matériel décent sur le problème. Étant donné que vous pouvez adresser des centaines de Go sur le matériel de base, le problème de mémoire est moins un problème que par le passé.Le mobile est le seul domaine réel où l'utilisation de la mémoire est limitée et où les environnements d'exécution spécialisés fonctionnent mieux à cet égard (voir ci-dessus). Le seul inconvénient principal pour Java (d'un point de vue HPC) est l'absence de types complexes pass-by-copy (c'est-à-dire en C#), donc tous les objets complexes doivent être alloués en faisant pression sur le GC. L'analyse des évasions est censée aider avec quelque chose, mais il est difficile de faire en sorte que cela fonctionne bien dans des cas très généraux (notez qu'il a récemment fait l'objet de diverses révisions du JDK).

Il convient de mentionner le large soutien linguistique (Scala et Groovy ++ ont de très bons profils de performance) et il y a un certain nombre de cadres simultanés de passage de messages (actors, akka, kilim).

C# /. Net

Probablement le plus complet du point de vue linguistique, surtout si vous incluez des choses comme F # pour aborder les choses d'une manière fonctionnelle. Cependant, vous êtes généralement poussé vers une plate-forme MS si vous voulez la meilleure performance (et l'histoire mobile ici n'est pas génial non plus). Mono produit une très bonne fonctionnalité de plate-forme (attention: je suis un contributeur), mais ils jouent toujours un rattrapage avec la performance, par ex. un collecteur précis et compact a récemment été ajouté et est encore un peu expérimental.

Google Go

Très nouveau, mais intéressant du point de vue qu'il est natif compilé (pas de frais généraux de JIT), mais il a encore une exécution forte, modèle de mémoire, garbage collector et un soutien direct pour les CSP (traitement séquentiel simultané) caractéristiques dans les langues (canaux). Il y a probablement plusieurs façons d'y arriver, le développement d'un nouveau GC a commencé mais il n'est pas encore apparu et il y a probablement beaucoup plus de choses à sortir du compilateur.

Haskell et d'autres langages fonctionnels

Pas beaucoup d'expérience, mais quelques-uns des constructions fonctionnelles telles que immuabilité et collections persistantes peuvent être très utiles pour créer des applications concurrentes robustes.

+0

La gestion manuelle de la mémoire n'est * pas * difficile en C++. il a des conteneurs, des pointeurs intelligents, et RAII que vous ne supprimez ou ne libérez jamais manuellement. – Inverse

+0

J'ai mis à jour la section C++, mais le point était plus que la gestion de la mémoire C/C++ (même en utilisant des bibliothèques de support) devient très difficile dans un scénario simultané. –

0

le système doit être capable d'effectuer informatique hautement parallèle avec une efficacité vitesse &, idéalement profiter de SSE, et idéalement soutenir CUDA/OpenCL.

Ceci le réduit à C ou C++. Et puisque vous voulez OO, il est réduit à C++.

Plus sérieusement, choisissez ce que vous ou vos développeurs sont meilleurs.

Questions connexes