Как я устанавливаю минуту Java и макс. размер "кучи" через переменные среды?

В приведенных выше ответах указывается, как размер блока может повлиять на производительность и предложить общую эвристику для ее выбора, основанную на максимизации занятости. Не желая предоставлять критерий для выбора размера блока, стоит упомянуть, что CUDA 6.5 (теперь в версии Release Candidate) включает несколько новых функций времени выполнения, которые помогают вычислениям занятости и конфигурации запуска, см.

CUDA Pro Совет: API занятости упрощает конфигурацию запуска

. Одна из полезных функций - cudaOccupancyMaxPotentialBlockSize, которая эвристически вычисляет размер блока, который достигает максимальной занятости. Значения, предоставляемые этой функцией, могут быть затем использованы в качестве отправной точки для ручной оптимизации параметров запуска. Ниже приведен небольшой пример.

#include 

/************************/
/* TEST KERNEL FUNCTION */
/************************/
__global__ void MyKernel(int *a, int *b, int *c, int N) 
{ 
    int idx = threadIdx.x + blockIdx.x * blockDim.x; 

    if (idx < N) { c[idx] = a[idx] + b[idx]; } 
} 

/********/
/* MAIN */
/********/
void main() 
{ 
    const int N = 1000000;

    int blockSize;      // The launch configurator returned block size 
    int minGridSize;    // The minimum grid size needed to achieve the maximum occupancy for a full device launch 
    int gridSize;       // The actual grid size needed, based on input size 

    int* h_vec1 = (int*) malloc(N*sizeof(int));
    int* h_vec2 = (int*) malloc(N*sizeof(int));
    int* h_vec3 = (int*) malloc(N*sizeof(int));
    int* h_vec4 = (int*) malloc(N*sizeof(int));

    int* d_vec1; cudaMalloc((void**)&d_vec1, N*sizeof(int));
    int* d_vec2; cudaMalloc((void**)&d_vec2, N*sizeof(int));
    int* d_vec3; cudaMalloc((void**)&d_vec3, N*sizeof(int));

    for (int i=0; i>>(d_vec1, d_vec2, d_vec3, N); 

    cudaEventRecord(stop, 0);
    cudaEventSynchronize(stop);
    cudaEventElapsedTime(&time, start, stop);
    printf("Kernel elapsed time:  %3.3f ms \n", time);

    printf("Blocksize %i\n", blockSize);

    cudaMemcpy(h_vec3, d_vec3, N*sizeof(int), cudaMemcpyDeviceToHost);

    for (int i=0; i

EDIT

cudaOccupancyMaxPotentialBlockSize определен в файле cuda_runtime.h и определяется следующим образом:

template
__inline__ __host__ CUDART_DEVICE cudaError_t cudaOccupancyMaxPotentialBlockSize(
    int    *minGridSize,
    int    *blockSize,
    T       func,
    size_t  dynamicSMemSize = 0,
    int     blockSizeLimit = 0)
{
    return cudaOccupancyMaxPotentialBlockSizeVariableSMem(minGridSize, blockSize, func, __cudaOccupancyB2DHelper(dynamicSMemSize), blockSizeLimit);
}

Значения для параметров следующие

minGridSize     = Suggested min grid size to achieve a full machine launch.
blockSize       = Suggested block size to achieve maximum occupancy.
func            = Kernel function.
dynamicSMemSize = Size of dynamically allocated shared memory. Of course, it is known at runtime before any kernel launch. The size of the statically allocated shared memory is not needed as it is inferred by the properties of func.
blockSizeLimit  = Maximum size for each block. In the case of 1D kernels, it can coincide with the number of input elements.

. Обратите внимание, что с CUDA 6.5 необходимо вычислить собственные размеры 2D / 3D блока из размера блока 1D, предложенного API.

Обратите также внимание на то, что API-интерфейс драйвера CUDA содержит функционально эквивалентные API для расчета занятости, поэтому можно использовать cuOccupancyMaxPotentialBlockSize в коде API-интерфейса водителя так же, как показано для API-интерфейса времени выполнения в приведенном выше примере.

70
задан Vadzim 9 February 2015 в 10:12
поделиться

5 ответов

Вы не можете сделать этого с помощью переменных среды непосредственно. Необходимо использовать набор "нестандартных" опций, которые передаются команде Java. Выполненный: Java-X для деталей. Опции, которые Вы ищете, являются-Xmx и-Xms (это - "начальный" размер "кучи", так вероятно, что Вы ищете.)

Некоторые продукты как Муравей или Tomcat могли бы идти со сценарием пакетной обработки, который ищет переменную среды JAVA_OPTS, но это не часть Среды выполнения Java. При использовании одного из тех продуктов можно быть в состоянии установить переменную как:

set JAVA_OPTS="-Xms128m -Xmx256m"  

можно также проявить этот подход с собственной командной строкой как:

set JAVA_OPTS="-Xms128m -Xmx256m"  
java ${JAVA_OPTS} MyClass
73
ответ дан nickb 24 November 2019 в 13:21
поделиться

Вы не можете сделать этого с помощью переменных среды. Это сделано через "нестандартные" опции. Выполненный: java -X для деталей. Опции, которые Вы ищете, -Xmx и -Xms (это - "начальный" размер "кучи", так вероятно, что Вы ищете.)

10
ответ дан a2800276 24 November 2019 в 13:21
поделиться

Я думаю, что Ваша единственная опция состоит в том, чтобы обернуть Java в сценарий, который заменяет переменными среды в командную строку

4
ответ дан frankodwyer 24 November 2019 в 13:21
поделиться

Можно использовать JAVA_TOOL_OPTIONS.

Пример:

export JAVA_TOOL_OPTIONS=-Xmx512m

Это было упомянуто в некоторых комментариях, и в другой ответ .

вопрос OP довольно стар, но поскольку это - первый результат Google для вопроса, я думал, что добавлю ответ здесь для пользы ясности.

0
ответ дан 24 November 2019 в 13:21
поделиться

Пара примечаний:

  1. Муравей Apache ничего не знает о JAVA_OPTS, в отличие от сценариев запуска Tomcat. Для Apache ant используйте ANT_OPTS, чтобы повлиять на среду для JVM, которая запускает / ant /, но не на то, что может запускать ant.

  2. Максимальный размер кучи, который вы можете установить, полностью зависит от среды: для большинства 32-битных систем максимальный объем кучи, который вы можете запросить, независимо от доступной памяти, находится в диапазоне 2 ГБ. Самая большая куча в 64-битной системе «действительно большая». Кроме того, вы также практически ограничены физической памятью, поскольку кучей управляет JVM, и вы не хотите, чтобы на диск выполнялась большая подкачка.

  3. Для серверных сред вы обычно хотите установить -Xms и -Xmx в одно и то же значение: это исправит размер кучи на определенном размере, и сборщик мусора будет выполнять меньше работы, потому что куча никогда не будет изменить размер.

3
ответ дан 24 November 2019 в 13:21
поделиться
Другие вопросы по тегам:

Похожие вопросы: