Я думаю, что вам лучше всего смотреть на загрузку этих вычислений на видеокарту. Существует openCL, который может использовать видеокарты для такого рода вещей, а также использовать шейдеры openGL.
Чтобы по-настоящему воспользоваться этим, вы хотите рассчитывать параллельно. Допустим, вы хотите получить квадратный корень (простой, я знаю, но принцип тот же) 1 миллион чисел. На процессоре вы можете делать только одно по одному или вычислять, сколько у вас ядер, разумно ожидать, скажем, 8 ядер, и каждое из них должно выполнять вычисления на подмножестве данных.
Если вы, например, перенесете свои расчеты на видеокарту, вы «загрузите» в свои данные, скажем, кучу 1/4 миллиона трехмерных точек в пространстве (это четыре поплавка на вершину), а затем получите вершинный шейдер вычислить квадратный корень каждого xyzw каждой вершины. у видеокарт чертовски много ядер, даже если их всего 100, она все равно может работать на гораздо большем количестве, чем процессор.
Я могу дополнить это дополнительной информацией, если хотите, хотя я не рассчитываю на использование шейдеров, но мне нужно в любом случае встать, чтобы поцарапать их.
EDIT
глядя на эту дешевую карту родственников NVIDEA GT 220 вы можете видеть, что у нее 48 ядер 'CUDA'. Это то, что вы используете, когда используете такие вещи, как openCL и шейдеры.
РЕДАКТИРОВАТЬ 2
Хорошо, похоже, вы довольно заинтересованы в использовании ускорения GPU. Я не могу помочь вам с использованием openCL, никогда не рассматривал его, но я предполагаю, что он будет работать во многом с теми же приложениями openGL / DirectX, которые используют шейдеры, но без реального графического приложения. Я собираюсь поговорить о вещах DirectX, так как это то, что я знаю (примерно), но, насколько я понимаю, это почти одинаково для openGL.
Во-первых, вам нужно создать окно. Если вам нужна кроссплатформенность, GLUT - это, вероятно, лучший путь, это не лучшая библиотека в мире, но она дает вам окно красиво и быстро. Поскольку вы фактически не собираетесь показывать какой-либо рендеринг, вы можете просто сделать его крошечным окном, достаточно большим, чтобы установить для заголовка что-то вроде «HARDWARE ACCELERATING».
Как только ваша видеокарта настроена и готова к рендерингу, вы переходите к этому этапу, следуя учебным пособиям . Это приведет вас к тому, что вы сможете создавать 3D-модели и «анимировать» их на экране.
Далее вы хотите создать буфер вершин, который вы заполняете входными данными. вершина обычно составляет три (или четыре) числа с плавающей точкой. Если все ваши ценности независимы, это круто. но если вам нужно сгруппировать их, скажем, если вы на самом деле работаете с 2D-векторами, то вам нужно убедиться, что вы правильно упаковали данные. скажем, вы хотите выполнять математику с 2D-векторами, а openGL работает с 3D-векторами, тогда vector.x и vector.y - это фактически входной вектор, а vector.z будет просто резервными данными.
Видите ли, векторный шейдер может работать только с одним вектором за раз, он не может видеть более одного вектора в качестве входных данных, вы можете использовать геометрический шейдер, который может просматривать большие наборы данных.
Итак, вы установили буфер вершин и поместили его на видеокарту. Вам также нужно написать «вершинный шейдер», это текстовый файл с языком, подобным Си, который позволяет вам выполнять некоторые математические операции. Это не полная реализация C, но она выглядит достаточно похоже на C, чтобы вы знали, что делаете. Точные входы и выходы шейдеров openGL мне не известны, но я уверен, что простой урок достаточно легко найти.
Одна вещь, с которой вы сами по себе, - это выяснить, как именно вы можете заставить выходные данные вершинного шейдера переходить во второй буфер, который фактически является вашим выходом. Вершинный шейдер не изменяет данные вершин в заданном вами буфере, который является постоянным (в отношении шейдера), но вы можете получить шейдер для вывода во второй буфер.
ваш расчет будет выглядеть примерно так
createvertexbuffer()
loadShader("path to shader code", vertexshader) // something like this I think
// begin 'rendering'
setShader(myvertexshader)
setvertexbuffer(myvertexbuffer)
drawpoints() // will now 'draw' your points
readoutputbuffer()
Надеюсь, это поможет. Как я уже сказал, я все еще учусь этому, и даже тогда я изучаю DirectX.